2016-02-14 183 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); 

現在,我想通過與信號newPacket(...)所有5個項目,如一行,在MainWindow連接到onNewPacket(...)插槽class Ethernet發射。

我想僅傳遞信號中的一個參數,因爲字段數可能會增加。也許有正確的方式爲QTableWidget/QTableView傳遞一行?我需要使用QTableWidget還是QTableView?

回答

1

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

0

按照我對Qt的經驗,當需要更小的表時,QTableWidget是不錯的選擇。但是如果你使用真實日誌,例如100000行,那麼最好從QAbstractTableModel派生你自己的模型,並從QTableView派生你自己的視圖並覆蓋所需的函數。 想象一下,您的日誌很大,而且窗口只能顯示50行。 在你的代碼中,你必須首先分配和設置所有的日誌項,但是如果你有自己的派生類(根據Qt模型/視圖框架),你的派生函數將只爲實際顯示的50個項目提供數據。 當然,要實現它還有很多工作要做。

+0

有趣的想法。我在一個窗口中想了大約50條記錄,但我不知道我能做到這一點。你能給我建議/鏈接嗎? – gek0n

+0

在這種情況下,將項目添加到QTableWidget的方式是正確的:insertRow(),然後爲每列分配傳遞給setItem()的QTableWidgetItem。它沒有特別的附加魔法。 – StackPeter

相關問題