Создайте QTableWidget с 2 или более строками заголовка - PullRequest
3 голосов
/ 14 января 2012

Я хотел бы иметь QTableWidget, который имеет 2 строки 'header'.По сути, я бы хотел, чтобы верхние 2 строки таблицы не прокручивались вертикально.Например:

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

Я бы хотел, чтобы ни один из 4 заголовков (первые две строки) не прокручивался за пределы экрана при прокрутке пользователя вниз.

Я не вижув любом случае в Qt добавить дополнительные строки заголовка или предотвратить прокрутку одной строки.Может быть, есть хитрый способ сделать это, имея две фактические таблицы и одну из этих таблиц, имеющих одну строку, которая является заголовком?

1 Ответ

5 голосов
/ 18 января 2012

Я нашел способ сделать это, хотя и несколько непонятно.Я нашел отличный пример того, как сделать что-то подобное, но с колонками вместо строк заголовка.

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

Код:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...