Я пытаюсь перейти от распечатки ниже (для которой в настоящее время я могу изменить и принять формат каждой ячейки определенного столбца QTableView
, делая это вручную для каждой ячейки).
Также QTableView
формируется из следующих столбцов, которые будут prcise: id - name - save - ACoord - BCoord - CCoord - DCoord, и я помещаю только экран печати заинтересованной части:
![Manual](https://i.imgur.com/qOJfkQ5.png)
Чтобы изменить весь столбец за один раз, используя QAction
, как показано ниже, что я и хотел бы достичь:
![QAction_change_column](https://i.imgur.com/tpOEKaX.png)
См. Ниже наиболее важную часть кода, которую я пытаюсь достичь (я поместил код только для одного столбца):
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;
};
Я видел этот пост . Также этот пост , но здесь упоминается QStyledItemDelegate
, однако я не уверен, что это может быть правильным выбором.
И компилятор в режиме отладки говорит: ASSERT failure in QList<T>::operator[]: "index out of range
Как это сделать?
Пожалуйста, пролите свет на эту проблему, если это возможно.