2015-09-04 226 views
-1

我必須使用QTableWidget顯示項目列表。我在運行時動態插入這些項目。QTableWidget不顯示行

問題是QTableWidget控件沒有顯示任何行。我已經通過調試器驗證過這些項目是否已插入,但出於某種原因,該小部件不會刷新/重新繪製。

我已經廣泛搜索了網頁,並嘗試了類似案例的建議解決方案,但沒有成功。

請找到相關的代碼如下:

QTableWidget.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>QDialogClassName</class> 
<widget class="QDialog" name="QDialogClassName"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>800</width> 
    <height>587</height> 
    </rect> 
    </property> 
    <property name="sizePolicy"> 
    <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 
    <horstretch>0</horstretch> 
    <verstretch>0</verstretch> 
    </sizepolicy> 
    </property> 
    <property name="windowTitle"> 
    <string>QDialogClassName</string> 
    </property> 
    <widget class="QWidget" name="verticalLayoutWidget"> 
    <property name="geometry"> 
    <rect> 
    <x>10</x> 
    <y>40</y> 
    <width>781</width> 
    <height>541</height> 
    </rect> 
    </property> 
    <layout class="QVBoxLayout" name="verticalLayout"> 
    <item> 
    <widget class="QLabel" name="introductionLabel"> 
     <property name="sizePolicy"> 
     <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> 
     <horstretch>0</horstretch> 
     <verstretch>0</verstretch> 
     </sizepolicy> 
     </property> 
     <property name="autoFillBackground"> 
     <bool>false</bool> 
     </property> 
     <property name="text"> 
     <string>Label</string> 
     </property> 
    </widget> 
    </item> 
    <item> 
    <spacer name="verticalSpacer"> 
     <property name="orientation"> 
     <enum>Qt::Vertical</enum> 
     </property> 
     <property name="sizeType"> 
     <enum>QSizePolicy::Fixed</enum> 
     </property> 
     <property name="sizeHint" stdset="0"> 
     <size> 
     <width>20</width> 
     <height>20</height> 
     </size> 
     </property> 
    </spacer> 
    </item> 
    <item> 


    <widget class="QTableView" name="tableView"> 
    <property name="geometry"> 
    <rect> 
     <x>30</x> 
     <y>30</y> 
     <width>551</width> 
     <height>271</height> 
    </rect> 
    </property> 

    <property name="sortingEnabled"> 
     <bool>true</bool> 
    </property> 
    <attribute name="horizontalHeaderVisible"> 
     <bool>true</bool> 
    </attribute> 
    <attribute name="horizontalHeaderStretchLastSection"> 
     <bool>true</bool> 
    </attribute>  
    </widget> 




    </item> 
    <item> 
    <widget class="QProgressBar" name="progressBar"> 
     <property name="sizePolicy"> 
     <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> 
     <horstretch>0</horstretch> 
     <verstretch>0</verstretch> 
     </sizepolicy> 
     </property> 
     <property name="value"> 
     <number>24</number> 
     </property> 
    </widget> 
    </item> 
    <item> 
    <layout class="QHBoxLayout" name="buttonsHorizontalLayout"> 
     <item> 
     <spacer name="horizontalSpacer"> 
     <property name="orientation"> 
     <enum>Qt::Horizontal</enum> 
     </property> 
     <property name="sizeHint" stdset="0"> 
     <size> 
      <width>40</width> 
      <height>20</height> 
     </size> 
     </property> 
     </spacer> 
     </item> 
     <item> 
     <widget class="QPushButton" name="previousBackButton"> 
     <property name="text"> 
     <string>Previous...</string> 
     </property> 
     </widget> 
     </item> 
     <item> 
     <widget class="QPushButton" name="nextButton"> 
     <property name="text"> 
     <string>Next...</string> 
     </property> 
     </widget> 
     </item> 
    </layout> 
    </item> 
    </layout> 
    </widget> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

ui_QTableWidget.h

tableWidget = new QTableWidget(verticalLayoutWidget); 
    tableWidget->setObjectName(QStringLiteral("tableWidget")); 
    tableWidget->setShowGrid(true); 
    tableWidget->setColumnCount(N_COLUMNS); 
    tableWidgetHeader << "Header1" << "Header2"; 
    tableWidget->setHorizontalHeaderLabels(tableWidgetHeader); 
    tableWidget->setRowCount(0); 
    tableWidget->verticalHeader()->setVisible(true); 
    tableWidget->verticalHeader()->show(); 

    verticalLayout->addWidget(tableWidget); 

QTableWidget.cpp

int row_count; 
QTableWidgetItem *itab; 
row_count = ui->tableWidget->rowCount(); 
ui->tableWidget->insertRow(row_count); 
// as an alternative to the above line of code I have also tried ui->tableWidget->->setRowCount(row_count); 


itab = new QTableWidgetItem; 
itab->setText("Cell1"); 
ui->tableWidget->setItem(row_count, 0, itab); 
ui->tableWidget->item(row_count, 0)->setBackground(Qt::red); 

itab = new QTableWidgetItem; 
itab->setText("Cell2"); 
ui->tableWidget->setItem(row_count, 1, itab); 
ui->tableWidget->item(row_count,1)->setBackground(Qt::green); 

/*Each of the following lines is an attempted solution. Other proposed solutions include emiting rowCountChanged and similar protected signals. */ 
    //ui->tableWidget->update(); 
    //ui->tableWidget->show(); 
    //ui->tableWidget->viewport()->update(); 
    //ui->tableWidget->viewport()->show(); 

我在做什麼錯?我怎樣才能解決這個問題?

+0

以正確的方式實現小工具,手動更新,*從未*必要的。考慮這些變通辦法總是指向其他問題。 –

+0

您的用戶界面中沒有'QTableWidget',只有'QTableView'。 –

+0

對不起,但我無法重現您的問題。你的用戶界面文件是可以的。投票結束,因爲你仍然拒絕提供一個能夠複製你的問題的自我測試案例。 –

回答

3

看來你正在做的一切都差不多正確。有兩個問題:

  1. 當你插入的項目爲可潛在排序的表格部件,每一行項目的變化可以訴諸的觀點,並最終改變了行索引。在設置item1的文本後,它所在的行將不是您插入空行的行。您必須在每次文字更改後獲取該項目的行。

  2. 由於沒有頂層佈局,您的用戶界面文件會略有中斷,但這不會影響視圖本身的功能。

以下測試用例演示了它的全部工作。您在此處未顯示的其他一些代碼已損壞。

  1. 您的行插入代碼是否曾運行?在那裏設置一個斷點,看看它是否觸發。

  2. 您有其他意見嗎?也許重疊?您確定要將行添加到您正在查看的視圖嗎?

  3. 確保您看到表格窗口小部件的標題 - 如果您沒有,那麼您的整個表格窗口小部件不可見,並且您的問題與您插入的任何行沒有關係。

  4. 您是否在行插入後阻止事件循環,從不給予重繪的機會?行添加後應用程序是否響應?

這些確實是調試基礎知識,但是您從未在問題中指出您已經檢查過這些內容。

screenshot

// https://github.com/KubaO/stackoverflown/tree/master/questions/tablewidget-32403753 
#include <QtWidgets> 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 

    QWidget w; 
    QVBoxLayout layout { &w }; 

    QTableWidget tw; 
    tw.setShowGrid(true); 
    tw.setColumnCount(2); 
    auto header = QStringList() << "Header1" << "Header2"; 
    tw.setHorizontalHeaderLabels(header); 
    tw.setSortingEnabled(true); 

    QPushButton button { "Add Row" }; 
    QObject::connect(&button, &QPushButton::clicked, &tw, [&tw]{ 
     auto row = tw.rowCount(); 
     tw.insertRow(row); 

     auto item1 = new QTableWidgetItem { "Cell1" }; 
     item1->setBackground(Qt::red); 
     tw.setItem(row, 0, item1); 
     row = item1->row(); // Needed to support sorted tables. 

     auto item2 = new QTableWidgetItem { "Cell2" }; 
     item2->setBackground(Qt::green); 
     tw.setItem(row, 1, item2); 
    }); 

    layout.addWidget(&tw); 
    layout.addWidget(&button); 
    w.show(); 
    return app.exec(); 
} 
+0

謝謝。我可以在我的實現中看到標題,但我看不到插入的任何行。這很奇怪! – geraldCelente

+0

@geraldCelente所以,你只是沒有顯示足夠的代碼來找出錯誤:( –

+0

我已經包含了所有與QTableView控件相關的代碼。我還能做什麼? – geraldCelente