我想为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吗?
答案 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个项提供数据。 当然,实施它还需要做更多的工作。