【问题标题】:QTableWidget or QTableView for adding a row?QTableWidget 或 QTableView 用于添加一行?
【发布时间】: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?

【问题讨论】:

    标签: qt qtableview qtabwidget


    【解决方案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。没有特殊的附加魔法。
      猜你喜欢
      • 2019-01-11
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多