2016-02-14 6 views
0

Я хочу сделать что-то вроде журнала для TCP-пакетов. И я пытаюсь использовать QTableWidget, но не уверен, что это правильный путь:QTableWidget или QTableView для добавления строки?

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 ,

Я хочу передать только один параметр в сигнал, потому что количество полей может увеличиться. Может быть, есть правильный способ передать строку для QTableWidget/QTableView? Нужно ли использовать QTableWidget или QTableView?

ответ

1

QTableView (и другие виджеты Model/View) предпочтительнее для отображения значительного объема данных. Это также дает вам большую гибкость в том, как данные отображаются/редактируются.

Это очень легко начать с 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.

0

По моему опыту с Qt, при необходимости, меньшая таблица, то QTableWidget - хороший выбор. Но если вы работаете над реальным журналом, который может иметь, например, 100000 строк, лучше извлечь свою собственную модель из QAbstractTableModel и свой собственный вид из QTableView и переопределить необходимые функции. Представьте, что у вас большой журнал, и ваше окно может отображать только 50 строк. В случае вашего кода вы должны сначала выделить и задать все элементы журнала, но в случае ваших собственных производных классов (в соответствии с моделью Qt/представлением) ваши производные функции будут предоставлять данные только для фактически отображаемых 50 элементов. Конечно, для его реализации гораздо больше работы.

+0

Интересная идея. Я думал о 50 записях в одном окне, но я не знаю, как это сделать. Можете ли вы дать мне совет/ссылку? – gek0n

+0

В этом случае ваш способ добавления элементов в QTableWidget прав: insertRow(), за которым следует распределение QTableWidgetItem, переданного в setItem() для каждого столбца. Никакой дополнительной дополнительной магии. – StackPeter