Я знаю, что тема про множественный выбор поднималась хотя бы раз, но, честно говоря, уже не могу ее найти и не помню, чтобы у нее было достойное решение.
Предлагаю обсудить два вопроса:
1) Создание поведения, аналогичного выбору ячейки MS Excel. Таким образом, пользователь щелкает одну ячейку в QTableView и получает выделенную выделенную ячейку, а также несколько «зависимых» ячеек меняют внешний вид (выбираются или просто выделяются каким-либо образом). В Excel он широко используется для отображения зависимостей формулы ячейки.
Я знаю, что есть несколько подходов к ее решению. Самый простой — изменить выбор представления с зависимой ячейкой в любом из соответствующих обработчиков сигналов (например, QAbastractModelView clicked()). Такой способ выполняет свою работу, но имеет неприятный побочный эффект: из-за того, что сигналы, доставляемые после перерисовки выбранной ячейки, происходят, поэтому зависимый выбор рисуется после первой ячейки, что приводит к мерцанию.
Второй подход - это путь делегата. Это также имеет некоторые проблемы, потому что вы получаете paintEvent только для выбранной ячейки, поэтому вы не так уж много можете сделать с «зависимыми» ячейками. На самом деле я смог решить это таким образом, перехватив щелчок, изменив выделение и используя полностью настраиваемый делегат, который рисует все, как только сформирован полный выбор, поэтому на самом деле он пропускает первую перерисовку, но опять же я не был полностью удовлетворен с результатами, хотя визуально это выглядело совершенно правильно ... в основном потому, что общее время отклика TableView значительно уменьшилось. Причина этого в том, что Qt рисует собственный выбор сразу после получения щелчка мыши перед отправкой каких-либо сигналов пользовательским классам, и в случае этого подхода paintEvent в делегате поступает после нескольких основных циклов. Таким образом, существует заметная задержка в случае использования «отрисовки выбора в делегате» по сравнению с «отрисовкой собственного выбора».
Я уже начинаю думать, что лучшим вариантом может быть полная перезапись большей части QTableView, чтобы добавить поддержку таких схем выбора, но, может быть, есть более прямой подход?
2) Второй вопрос (сложил их вместе, потому что есть что-то общее). Допустим, у вас есть сетка, представляющая финансовую информацию по месяцам, и в течение месяца есть несколько столбцов информации, поэтому блок из N столбцов повторяется M раз. Очевидный способ сделать такую сетку более читабельной — использовать другой стиль для вертикальных линий в сетке для первого столбца данных в каждом месяце. Скажем, сделать их на 1-2 пикселя шире.
Поскольку вы не можете указать стиль сетки для каждой ячейки, я установил setGrid(false), а затем нарисовал свои собственные линии сетки в качестве содержимого ячейки в делегате.
Но затем я столкнулся с проблемами из пункта 1. Затем вы указываете Qt использовать делегата в определенной ячейке, прежде чем делегат получит paintEvent Qt очищает фон ячейки. А в случае скрытой сетки фоновый прямоугольник, который очищает Qt, на один пиксель больше, чем требуется. Вероятно, это можно считать ошибкой Qt, потому что они не учитывают видимость сетки, но это приводит к удалению линий сетки в соседней ячейке, поэтому вам нужно рисовать в делегате не только собственную сетку ячейки, но и пересчитывать правильный прямоугольник ячейки, проверьте, если Qt допустил ошибку (проанализировав прямоугольник QPainter), решите, нужно ли восстановить то, что удаляется из соседней ячейки, и также перерисовать его. Это приводит к очень сложной логике делегирования, и я не могу считать это достойным решением.
Итак, вопрос 2 можно перефразировать так: знаем ли мы достойный способ стилизации сетки для каждой ячейки в QTableView?