使用2个或更多标题行创建QTableWidget

时间:2012-01-13 20:27:55

标签: python pyqt

我想要一个有2个'标题'行的QTableWidget。基本上我想让表格的前2行不垂直滚动。例如:

Header 1 | Header 2
__________________
Header 3 | Header 4
__________________
Data     | Data
__________________
Data     | Data
__________________
Data     | Data
__________________
Data     | Data
__________________

我想阻止4个标题(前两行)中的任何一个在用户向下滚动时不滚动屏幕。

我在Qt中没有看到添加额外的标题行或阻止单行滚动。也许有一个棘手的方法来实现这一点,有两个实际的表和其中一个表有一行是一个标题?

1 个答案:

答案 0 :(得分:5)

我找到了一种方法来做到这一点,虽然有点模糊。我确实找到了一个很好的例子,说明如何做类似的事情,但是用列而不是标题行。

http://doc.qt.nokia.com/4.7-snapshot/itemviews-frozencolumn.html

  1. 我创建了两个表,一个用于标题行,另一个用于数据。然后,我将数据表的水平标题隐藏起来,将所有内容的边距/间距设置为0.这样可以将表格压得足够紧密,看起来像一张桌子。

  2. 确保隐藏每个表的水平滚动条,然后添加连接两个隐藏滚动条的新滚动条。因此,当用户使用独立滚动条滚动时,它会触发“真实”隐藏滚动条上的事件。这样,用户只能使用一个滚动条进行交互。

  3. 我还必须捕获来自QHeaderView类的所有信号 并确保同时将信号请求的更改应用于两个表。

  4. 最重要的部分是确保两个表中垂直标题项的宽度相同。垂直标题项的宽度在名为resizeEvent http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#resizeEvent的事件上设置。所以我不得不在我的类中重写这个方法,将两个表的标题设置为相同的宽度。

  5. 代码:

    def resize(self):
        """
        Called when we know the data table has been setup by Qt so we are
        guaranteed that the headers now have a width, etc.
    
        There is no other way to guarantee that your elements have been sized,
        etc. by Qt other than this event.
        """
    
        # Make the width of the vertical headers on the header table the same
        # size as the initialized width of the data table (data table widths
        # are setup automatically to fit the content)
        width = self._data_table.verticalHeader().width()
        self._header_table.verticalHeader().setFixedWidth(width)
    
    1. 覆盖selectAll()方法,以便当用户单击角落按钮时(如果启用),将选择两个表中的所有数据:
    2. 代码:

      def selectAll(self):
          """Select all data in both tables"""
      
          for table in [self._header_table, self._data_table]:
              for row in xrange(table.rowCount()):
                  for col in xrange(table.columnCount()):
                      item = table.item(row, col)
                      table.setItemSelected(item, True)