创建带有两个或更多表头行的QTableWidget
我想要一个QTableWidget,它有两行“标题”。也就是说,我希望表格的前两行在用户向下滚动时不会一起滚动。比如:
Header 1 | Header 2
__________________
Header 3 | Header 4
__________________
Data | Data
__________________
Data | Data
__________________
Data | Data
__________________
Data | Data
__________________
我想要防止这四个标题(前两行)在用户向下滚动时消失在屏幕外。
我在Qt中没有找到办法可以添加额外的标题行,或者让某一行不滚动。也许可以通过创建两个实际的表格来实现这个效果,其中一个表格只有一行作为标题?
1 个回答
6
我找到了一种方法来实现这个功能,虽然有点绕。我还发现了一个很好的例子,虽然是关于列的,而不是表头行。
http://doc.qt.nokia.com/4.7-snapshot/itemviews-frozencolumn.html
我创建了两个表,一个用来放表头行,另一个用来放数据。我把数据表的横向表头隐藏了,并把所有的边距和间距设置为0。这样就把两个表挤得很近,看起来就像一个表。
确保每个表的横向滚动条都隐藏,然后添加一个新的滚动条,把这两个隐藏的滚动条连接起来。这样,当用户用这个独立的滚动条滚动时,就会触发“真实”的隐藏滚动条的事件。这样用户只需要用一个滚动条就能操作。
我还需要捕捉所有来自QHeaderView类的信号,并确保同时对两个表应用信号请求的更改。
最棘手的部分是确保两个表的垂直表头项的宽度是一样的。垂直表头项的宽度是在一个叫做resizeEvent的事件中设置的,http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#resizeEvent。所以我必须在我的类中重写这个方法,把两个表的表头宽度设置成一样。
代码:
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)
- 重写selectAll()方法,这样当用户点击角落的按钮时,如果启用了,就会选择两个表中的所有数据:
代码:
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)