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