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 设计器拉伸最后一列

QT中的QtableWidget和QtableView使用有啥区别?

QTableWidget