Встраивание элемента управления в QTableView?

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

альтернативный текст

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

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


person Paul Wicks    schedule 16.11.2009    source источник


Ответы (3)


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

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

  • Create a subclass of QTableModel.
    • Select some data structure to store the contents of your rows. This can be pretty simple (a big internal list), or as complex as a SQL database (in which case see QSqlTableModel instead).
    • Override rowCount, columnCount, data, and setData.
      • rowCount and columnCount correspond fairly directly to what you use for a data model. If you basically are using a 2D array (or list of lists), they can be as short as one-liners.
      • data is where things get interesting. Item models store several different fields (which Qt calls roles) and what data returns depends on what role is being asked for. Note that I talk about the data types of what's returned but it always needs to be wrapped into QVariant.
        • Qt.DisplayRole is whatever text is displayed in the cells of the table. This is your actual data, and is by far the common case (so that this is the default role).
        • 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 по модели/представлению, если вы еще этого не сделали. И обязательно посмотрите на примеры представления элементов Qt. Многие из описанных реализованы в PyQt в гораздо меньшем количестве кода (включая два упоминания @Jesse), а примеры древовидной модели переносятся на таблицы, но с гораздо меньшими усилиями (вам нужно реализовать гораздо меньше, как описано выше).

person quark    schedule 17.11.2009

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

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

person Andy M    schedule 16.11.2009

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

Пример звездного делегата
Пример делегата Spin Box

person Jesse Vogt    schedule 16.11.2009