Как изменить весь формат QTableView, используя QAction - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь перейти от распечатки ниже (для которой в настоящее время я могу изменить и принять формат каждой ячейки определенного столбца QTableView, делая это вручную для каждой ячейки).

Также QTableView формируется из следующих столбцов, которые будут prcise: id - name - save - ACoord - BCoord - CCoord - DCoord, и я помещаю только экран печати заинтересованной части:

Manual

Чтобы изменить весь столбец за один раз, используя QAction, как показано ниже, что я и хотел бы достичь:

QAction_change_column

См. Ниже наиболее важную часть кода, которую я пытаюсь достичь (я поместил код только для одного столбца):

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

Как это сделать? Пожалуйста, пролите свет на эту проблему, если это возможно.

...