如何使用QAction更改QTableView的整个格式

时间:2019-03-05 20:36:23

标签: c++ c++11 qt5 qtableview qaction

我正尝试通过下面的打印内容(目前,我可以更改并接受QTableView的特定列的每个单元格的格式,手动为每个单元格进行设置)。

另外QTableView由以下几列构成:id-名称-保存-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;
};

我见过this post。还有this post,但这提到要使用QStyledItemDelegate,但是我不确定这是否是正确的选择。

处于调试模式的编译器显示:ASSERT failure in QList<T>::operator[]: "index out of range

该怎么做? 如果可能,请说明此问题。

0 个答案:

没有答案