2009-11-16 3 views
2

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

alt text

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

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

ответ

6

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

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

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

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

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

Чтобы правой кнопкой мыши:

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

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

1

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

Star Delegate Example
Spin Box Delegate Example

3

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

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

Смежные вопросы