Встраивание элемента управления в QTableView? - PullRequest
2 голосов
/ 16 ноября 2009

Я работаю над небольшим приложением qt (использующим PyQt4), и у меня есть идея, но я не уверен, как ее реализовать. У меня есть QTableView, который представляет некоторые данные, и я хотел бы добавить еще один столбец в QTableView, который содержит элемент управления флажок, который может быть подключен к некоторой части модели. Например, что-то вроде этого:

alt text

Обратите внимание, что в столбце Delete есть виджет-флажок для каждой строки (хотя это веб-приложение, а не приложение Qt для настольного компьютера, основной принцип тот же). Бонусные баллы, если я могу выбрать несколько рядов, щелкнуть правой кнопкой мыши и выбрать «Проверить / снять выделение».

Если что-то из этого неясно, оставьте комментарий здесь, и я уточню.

Ответы [ 3 ]

6 голосов
/ 17 ноября 2009

Внедрение вашей собственной табличной модели - это больше работы, чем использование QStandardItemModel (как рекомендует @Andy), но она дает вам хороший контроль над тем, что вы хотите сделать, поэтому я постараюсь дать вам краткое изложение того, что сделать. Я предполагаю, что вы знаете все о документации Qt и документации классов PyQt и можете найти любые классы, которые вам нужны. (Возможно, я объясню, если у вас уже есть QTableView, но лучше, чем что-то упустить, я думаю.)

Чтобы получить проверяемые состояния:

  • Создать подкласс QTableModel.
    • Выберите некоторую структуру данных для хранения содержимого ваших строк. Это может быть довольно простым (большой внутренний список) или таким же сложным, как база данных SQL (в этом случае см. QSqlTableModel вместо).
    • Переопределить rowCount, columnCount, data и setData.
      • rowCount и columnCount прямо соответствуют тому, что вы используете для модели данных. Если вы в основном используете 2D-массив (или список списков), они могут быть короткими, как однострочные.
      • data, где вещи становятся интересными. Модели предметов хранят несколько различных полей (которые Qt называет role ), и то, что возвращает data, зависит от того, какая роль запрашивается. Обратите внимание, что я говорю о типах данных того, что возвращается, но это всегда должно быть заключено в QVariant.
        • Qt.DisplayRole - любой текст, отображаемый в ячейках таблицы. Это ваши фактические данные, и это наиболее распространенный случай (так что это роль по умолчанию).
        • Qt.CheckStateRole - логическое значение. При возврате Qt.Checked будет установлен флажок, а при Qt.Unchecked появится непроверенный. Если все, что вы хотите, чтобы столбец содержал, это флажки, обрабатывайте только эту роль.
        • Другие роли полезны для значков, цветов фона и ряда других функций, кроме этих.
        • Любая необработанная роль должна возвращать QVariant.
      • setData симметрично data. Вы должны обрабатывать роли, которые вы обрабатываете в data: Qt.DisplayRole для фактических данных и Qt.CheckStateRole для флажков.

Чтобы разрешить множественный выбор строк, столбцов и ячеек. Для этого нужно разобраться в выборе модели . Короткая версия:

  • Установите режим выбора в представлении таблицы: view.setSelectionMode( QAbstractItemView.ContiguousSelection). Это позволит вам выделить смежные клетки. Вы также можете выделить произвольные ячейки: см. QAbstractView.SelectionMode.
  • Чтобы определить, какие ячейки фактически выбраны после действия, запросите в табличном представлении его модель выбора (обратите внимание на 'l' ): view.selectionModel().selectedIndexes(). Вы можете перебирать их с помощью цикла for.

Чтобы разрешить щелчок правой кнопкой мыши:

  • Переопределить ваш вид contextMenuEvent.
  • Создайте QMenu и подключите его к любым нужным слотам.

Для более глубокого понимания прочитайте руководство Qt по Model / View , если вы этого еще не сделали. И определенно посмотрите на примеры Qt . Многие из описанных реализованы в PyQt в гораздо меньшем количестве кода (включая два упоминания @Jesse), а примеры древовидной модели переносятся в таблицы, но с гораздо меньшим количеством работы (вам нужно реализовать намного меньше, как описано выше.)

3 голосов
/ 17 ноября 2009

Вы также можете взглянуть на QStandardItemModel, который дает вам интерфейс для взаимодействия с элементами через «проверяемое» состояние!

Вы также можете наследовать от QAbstractItemModel и использовать роль Qt :: CheckStateRole ...

1 голос
/ 16 ноября 2009

В Qt / C ++ вы можете создать делегата для пользовательских элементов в столбце. Я предполагаю, что вы можете сделать что-то очень похожее в PyQt. Смотрите следующие примеры:

Пример Star Delegate
Пример делегата Spin Box

...