我查看了有关更新表视图和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;
}
答案 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();
}
此代码只是一个示例代码 - 将其移动到您的生产代码时,您绝对应该做一些更改。