在 Qt table 视图中更改数据

Changing data in Qt table view

我在 Whosebug 上查看了之前关于更新 table 视图和 Qt tutorial 的问题,但我仍然无法让我的代码工作。我想在按下按钮时使用 setData 方法更新 table 视图数据。我的自定义模型 TableModel 中的方法 insertData 被调用,但数据没有改变(添加了新行)。问题出在哪里?我不确定这是否相关,但我的 table 视图在选项卡小部件上的 qwidget 上。

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tablemodel.h"
#include <iostream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->dataFetcher = new DataFetcher();

    tm = new TableModel(0);
    ui->tableView->setModel(tm);
    ui->tableView->show();

    this->setPushButtonHandlers();

}

MainWindow::~MainWindow()
{
    delete ui;
    delete this->dataFetcher;
}

void MainWindow::setPushButtonHandlers()
{
    connect(this->ui->refreshDataButton, SIGNAL (clicked()), this, SLOT (refreshDataHandler()));
}

void MainWindow::refreshDataHandler()
{
    this->tm->insertData();
}

TableModel.cpp

#include "tablemodel.h"
#include <iostream>

TableModel::TableModel(QObject *parent): QAbstractTableModel(parent)
{
}

int TableModel::rowCount(const QModelIndex &parent) const
{
    return 2;
}

int TableModel::columnCount(const QModelIndex &parent) const
{
    return 16;
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
    {
        return QString("Row%1, Column%2")
                .arg(index.row() + 1)
                .arg(index.column() +1);
    }
    return QVariant();
}

QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role == Qt::DisplayRole)
    {
        if (orientation == Qt::Horizontal) {
            switch (section)
            {
            case 0:
                return QString("Symbol");
            case 1:
                return QString("Name");
            case 2:
                return QString("Stock Exchange");
            case 3:
                return QString("Trade Price");
            case 4:
                return QString("Ask");
            case 5:
                return QString("Bid");
            case 6:
                return QString("Change");
            case 7:
                return QString("Change %");
            case 8:
                return QString("Previous close");
            case 9:
                return QString("Open");
            case 10:
                return QString("Days Low");
            case 11:
                return QString("Days High");
            case 12:
                return QString("Year Low");
            case 13:
                return QString("Year High");
            case 14:
                return QString("Change % From Year Low");
            case 15:
                return QString("Change % From Year High");
            }
        } else if (orientation == Qt::Vertical) {
            return QVariant(QString::number(section+1));
        }
    }
    return QVariant();
}

void TableModel::insertData()
{
    beginInsertRows(QModelIndex(), 3, 100);
    endInsertRows();

    QModelIndex rv = this->index(1, 1);
    setData(rv, 9999);
    emit dataChanged(rv, rv);
    QString s = data(rv).toString();
    std::cout << s.toUtf8().constData() << std::endl;
}

首先你应该重新实现insertRowsQAbstractItemModel的虚方法。接下来,您应该重构您的代码如下:

void TableModel::insertData()
{
    insertRows(rowCount(), 1, QModelIndex());
}

bool TableModel::insertRows(int row, int count, const QModelIndex &index)
{
    beginInsertRows();
    items.push_back("");
    endInsertRows();
    return true;
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (index.isValid() && role == Qt::DisplayRole) {
        return items.at(index.row());
    }
    return QVariant();
}

int TableModel::rowCount(const QModelIndex &parent) const
{
    return items.size();
}

另外,实际添加数据:

class TableModel {
    // ...your code...
    private:
        std::vector<QString> items;
};

此代码只是一个示例代码 - 将其移至您的生产代码时,您绝对应该做一些更改。