用于添加行的 QTableWidget 或 QTableView?

QTableWidget or QTableView for adding a row?

我想为 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);

现在,我想通过信号 newPacket(...) 传递所有 5 项,如一行,在 class Ethernet 中发射,连接到 MainWindow 中的 onNewPacket(...) 插槽。

我只想在信号中传递一个参数,因为字段数可能会增加。也许有正确的方法为 QTableWidget/QTableView 传递一行?我需要使用 QTableWidget 还是 QTableView?

根据我使用 Qt 的经验,当需要更小的 table 时,QTableWidget 是不错的选择。但是,如果您处理可能有 100000 行的真实日志,那么最好从 QAbstractTableModel 派生您自己的模型,从 QTableView 派生您自己的视图并覆盖所需的函数。 假设您有大量日志,而您的 window 只能显示 50 行。 对于您的代码,您必须首先分配和设置所有日志项,但对于您自己的派生 类(根据 Qt model/view 框架),您的派生函数将仅提供实际显示的数据 50项目。 当然要实现它还有很多工作。

QTableView(以及其他 Model/View 小部件)更适合显示大量数据。它还为您提供了数据如何 displayed/edited 的很大灵活性。

入手真的很简单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 可用。