用于添加行的QTableWidget或QTableView?

时间:2016-02-14 15:22:48

标签: qt qtableview qtabwidget

我想为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中的onNewPacket(...)位置连接到MainWindow中的set.seed(1) df <- data.frame( group = rep(c("Case", "Control"), each=16), timing = rep(c("T0", "T1", "T2", "T3"), each=4, times=2), food.type = rep (c("Very healthy", "Healthy", "Unhealthy", "Very bad"), times = 8), intake.percentage = runif(32, min=1, max=25) ) lst <- with(df, split(transform(df, intake.percentage2=100-intake.percentage), list(timing, food.type))) res <- lapply(lst, function(x) chisq.test(x[, -(1:3)])) sapply(res, "[", "p.value") # $T0.Healthy.p.value # [1] 0.009604491 # # $T1.Healthy.p.value # [1] 0.001794137 # # $T2.Healthy.p.value # [1] 0.04958723 # # $T3.Healthy.p.value # [1] 0.9904441 # # $T0.Unhealthy.p.value # [1] 0.4369428 # ... 广告位。

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

2 个答案:

答案 0 :(得分:2)

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可用。

答案 1 :(得分:0)

根据我对Qt的经验,当需要更小的表时,QTableWidget是不错的选择。但是如果你在真正的日志上工作,例如可以有100000行,那么最好从QAbstractTableModel派生你自己的模型,从QTableView中获取你自己的视图并覆盖所需的函数。 想象一下,你有大型日志,你的窗口只能显示50行。 如果您的代码必须首先分配和设置所有日志项,但是在您自己的派生类的情况下(根据Qt模型/视图框架),派生函数将仅为实际显示的50个项提供数据。 当然,实施它还需要做更多的工作。