在Qt表视图中更改数据

时间:2015-07-08 12:03:09

标签: c++ qt qtableview

我查看了有关更新表视图和Qt tutorial的stackoverflow的先前问题,但我仍然无法使我的代码工作。我想在按下按钮时使用setData方法更新表视图数据。我的自定义模型TableModel中的方法insertData被调用,但数据不会被更改(添加新行)。问题出在哪儿?我不确定这是否相关,但我的表格视图位于标签小部件的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;
}

1 个答案:

答案 0 :(得分:2)

首先,您应该重新实现insertRows的{​​{1}}虚拟方法。接下来,您应该重构您的代码如下:

QAbstractItemModel

另外,实际添加数据:

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();
}

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