QTableWidget 或 QTableView 用于添加一行?
Posted
技术标签:
【中文标题】QTableWidget 或 QTableView 用于添加一行?【英文标题】:QTableWidget or QTableView for adding a row? 【发布时间】:2016-02-14 15:22:48 【问题描述】:我想为 TCP 数据包做一个日志。我正在尝试使用 QTableWidget,但不确定这是否正确:
int index = ui->lwHistory->rowCount(); //get index to new row (adding to the end)
ui->lwHistory->insertRow(index);
// Fill the row in that way (think - it's bad way)
ui->lwHistory->setItem(index, 0, new QTableWidgetItem(QString::number(startTime.elapsed())));
ui->lwHistory->setItem(index, 1, new QTableWidgetItem("ETH"));
ui->lwHistory->setItem(index, 2, new QTableWidgetItem(""));
ui->lwHistory->setItem(index, 3, new QTableWidgetItem("Connected"));
ui->lwHistory->setItem(index, 4, new QTableWidgetItem("OK"));
ui->lwHistory->setRowHeight(0, 20);
现在,我想传递所有 5 个项目,比如一行带有信号 newPacket(...)
,在 class Ethernet
中发出,连接到 MainWindow
中的 onNewPacket(...)
插槽。
我只想在信号中传递一个参数,因为字段数可能会增加。也许有正确的方法为 QTableWidget/QTableView 传递一行?我需要使用 QTableWidget 还是 QTableView?
【问题讨论】:
【参考方案1】:QTableView
(和其他模型/视图小部件)更适合显示大量数据。它还为您在数据的显示/编辑方式上提供了很大的灵活性。
从QStandardItemModel
开始真的很容易:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
// Each data row has 2 properties: string and int
struct MyData
QString str;
int i;
;
QVector<MyData> data = "Hello", 1 , "World", 2 ;
// Configure the table view
auto tv = new QTableView(this);
auto model = new QStandardItemModel();
tv->setModel(model);
this->setCentralWidget(tv);
// Configure column titles
model->setHorizontalHeaderItem(0, new QStandardItem("String Column"));
model->setHorizontalHeaderItem(1, new QStandardItem("Int Column"));
// Add rows to the model
QList<QStandardItem*> rowData;
Q_FOREACH(const auto &item, data)
rowData.clear();
rowData << new QStandardItem(item.str);
rowData << new QStandardItem(QString("%1").arg(item.i));
model->appendRow(rowData);
在您的数据之上实现您自己的QAbstractItemModel
将有助于提高性能。有一个good tutorial 可用。
【讨论】:
【参考方案2】:根据我使用 Qt 的经验,当需要更小的表格时,QTableWidget 是不错的选择。但是,如果您处理可以具有例如 100000 行的真实日志,那么最好从 QAbstractTableModel 派生您自己的模型,从 QTableView 派生您自己的视图并覆盖所需的功能。 假设您有很大的日志,而您的窗口只能显示 50 行。 对于您的代码,您必须首先分配和设置所有日志项,但对于您自己的派生类(根据 Qt 模型/视图框架),您的派生函数将仅为实际显示的 50 个项目提供数据。 当然,实现它还有很多工作要做。
【讨论】:
有趣的想法。我在一个窗口中考虑了大约 50 条记录,但我不知道如何才能做到这一点。你能给我建议/链接吗? 在这种情况下,您将项目添加到 QTableWidget 的方式是正确的: insertRow() 然后为每一列分配传递给 setItem() 的 QTableWidgetItem。没有特殊的附加魔法。以上是关于QTableWidget 或 QTableView 用于添加一行?的主要内容,如果未能解决你的问题,请参考以下文章
QTableView/QTableWidget 网格样式表 - 网格线宽
如何将数据发送到 QTableView/QTableWidget (PyQt)
使用 QTableWidget / QTableView 滚动时锁定列?
QTableView / QTableWidget:使用 Qt 设计器拉伸最后一列