Я нашел способ сделать это, хотя и несколько непонятно.Я нашел отличный пример того, как сделать что-то подобное, но с колонками вместо строк заголовка.
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)