QTableWidget不显示行

时间:2015-09-04 17:39:31

标签: c++ qt 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();

我做错了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

看来你做的一切几乎都是正确的。有两个问题:

  1. 当您将项目插入可能可能排序的表格小部件时,每个行项目更改都可以求助视图并最终更改行索引。设置item1的文本后,它所在的行将不是您将空行插入的行。每次文字更改后,您必须获得该项目的行。

  2. 您的UI文件略有损坏,因为没有顶级布局,但这并不会影响视图本身的功能。

  3. 以下测试用例表明一切正常。您在此处未显示的其他一些代码已损坏。

    1. 您的行插入代码是否已运行?在那里设置一个断点,看它是否触发。

    2. 您还有其他意见吗?也许是重叠的?您确定要在您正在查看的视图中添加行吗?

    3. 确保您看到表格小部件的标题 - 如果您不这样做,那么您的整个表格小部件都不可见,并且您的问题与您要插入的任何行无关。 / p>

    4. 您是否在插入行后阻止了事件循环,从未让窗口小部件有机会重新绘制?添加行后应用程序是否响应?

    5. 这些是真正的调试基础,但您从未在问题中表明您已经检查过这些。

      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();
      }