我正尝试通过下面的打印内容(目前,我可以更改并接受QTableView
的特定列的每个单元格的格式,手动为每个单元格进行设置)。
另外QTableView
由以下几列构成:id-名称-保存-ACoord-BCoord-CCoord-DCoord,我只放置感兴趣部分的打印屏幕:
使用如下所示的QAction
一次更改整个列,这就是我要实现的行为:
请参见下面我要实现的代码中最重要的部分(我仅将代码放在一栏中):
edittabledialog.h
private slots:
void currentColumnChanged(const QModelIndex &mi);
void autoSelectMagicColumn();
private:
Ui::editTableDialog *ui;
QSqlTableModel *mModel;
QAction *mChangeFormat;
QPoint chanheInOneTime(QString input);
const int magicColumnIndexACoord = 3;
edittabledialog.cpp
editTableDialog::editTableDialog(const QString &tableName, QWidget *parent) :
QDialog(parent),
ui(new Ui::editTableDialog)
{
ui->setupUi(this);
mChangeFormat = new QAction(QIcon(":"), tr("from format 123:123 to (123,123)"), this);
mModel = new QSqlTableModel(this);
mModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
mModel->setTable(tableName);
mModel->select();
ui->tableView->setModel(mModel);
connect(ui->tableView->selectionModel(), SIGNAL(currentColumnChanged(const QModelIndex &, const QModelIndex &)),
this, SLOT(currentColumnChanged(const QModelIndex &)));
ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);
ui->tableView->addActions({mChangeFormat});
connect(mChangeFormat, &QAction::triggered, [&]() {
int row = -1, column = -1;
QString reference, type;
QModelIndex index;
Param param;
for(int i = 0; i < ui->tableView->model()->columnCount(); i++)
{
if(ui->tableView->model()->headerData(i, Qt::Horizontal).toString() == "ACoord") {
column = i;
type = "ACoord";
param.mACoord.setX(chanheInOneTime(index.sibling(row,3).data().toString()).x()); // <-- Debugger Error Here
param.mACoord.setY(chanheInOneTime(index.sibling(row,3).data().toString()).y());
mModel->submitAll();
ui->tableView->show();
}
}
});
}
void editTableDialog::currentColumnChanged(const QModelIndex &mi)
{
const int col = mi.column();
if (col == magicColumnIndexACoord) {
QTimer::singleShot(100, this, SLOT(autoSelectMagicColumn()));
}
}
void editTableDialog::autoSelectMagicColumn()
{
if (ui->tableView->selectionModel()->currentIndex().column() == magicColumnIndexACoord) {
ui->tableView->selectColumn(magicColumnIndexACoord);
}
}
QPoint editTableDialog::chanheInOneTime(QString input)
{
QPoint output;
if(input.contains('('))
{
output.setX(input.remove('(').remove(')').remove(',').split(" ")[0].toInt());
output.setY(input.remove('(').remove(')').remove(',').split(" ")[1].toInt());
}
else
{
output.setX(input.split(":")[0].toInt());
output.setY(input.split(":")[1].toInt()); // <-- Debugger Error Here
}
return output;
}
bool editTableDialog::submitData()
{
if(!mModel->submitAll()) {
QMessageBox::warning(this, "Submit Error", "Failed to write to table. Error was \"" + mModel->lastError().text() + "\"");
return false;
} else
{ return true; }
}
void editTableDialog::on_acceptBtn_clicked()
{ if(submitData())
accept(); }
Param
来自以下类 parameters.h :
typedef struct Param
{
int mId;
QString mName;
QByteArray mSave;
QPoint mACoord;
QPoint mBCoord;
QPoint mCCoord;
QPoint mDCoord;
} Param;
class Parameters
{
public:
Parameters(Param newdata);
Parameters(int id, const QString &name,
QPoint aCoord, QPoint bCoord, QPoint cCoord, QPoint dCoord,
const QByteArray &save);
QPoint mACoord() const { return data.mACoord; }
QPoint mBCoord() const { return data.mBCoord; }
QPoint mCCoord() const { return data.mCCoord; }
QPoint mDCoord() const { return data.mDCoord; }
void setData(Param ndat) { data = ndat; }
private:
Param data;
};
我见过this post。还有this post,但这提到要使用QStyledItemDelegate
,但是我不确定这是否是正确的选择。
处于调试模式的编译器显示:ASSERT failure in QList<T>::operator[]: "index out of range
该怎么做? 如果可能,请说明此问题。