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