用于添加行的 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 可用。
我想为 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 可用。