2013-04-19 3 views
0

Я знаю, что тема о мультивыборке возникает хотя бы один раз, но, честно говоря, ничто не может ее найти, и не помню, чтобы у нее было и достойное решение.«Ручной» мультивыбор в 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?

ответ

1

OMG, так много слов, можете ли вы просто выбрать самую важную информацию?

+0

Ну, если бы это был простой вопрос, я, вероятно, мог бы решить его сам =) это более тема для обсуждения, я считаю, что есть профессиональные разработчики Qt, которые сталкивались с аналогичными проблемами. Поэтому я просто предлагаю обсудить возможные решения. – evilruff

1

Я бы сделал что-то подобное:

Создать делегат. Подкласс QAbstractTableModel и reimplement data метод. Ваша реализация должна возвращать текст ячейки для Qt::DisplayRole, но также может возвращать то, что вы хотите, если role - одна из ваших определяемых пользователем ролей (например, шрифт или цвет или что-то еще из текста ячейки. Вы можете использовать любой номер роли выше Qt::UserRole). Ваша модель должна излучать сигнал dataChanged, чтобы уведомить QTableView, что содержимое изменено и должно быть перерисовано.

Затем в делегате вы просто запрашиваете эти данные, используя перегруженный QAbstractTableModel::data и рисуете так, как хотите.

+0

Я понял, что вы правильно поняли, что, как только определенная ячейка щелкнула, вы «настроите», допустим, некоторые роли украшения для «зависимых» ячеек, чтобы они не были выбраны, но перерисованы из-за того, что вы выбрали dataChanged? Интересный подход, но разве у вас нет заметной задержки между выбором, и другие ячейки меняют внешний вид? – evilruff

+0

Я так не думаю, потому что весь GUI в qt обрабатывается в одном потоке, и я не вижу причин, по которым перерисовать в этом потоке можно отложить. Однако, если вы хотите быть уверенным, вы можете отключить и включить обновления с помощью 'QWidget :: setUpdatesEnabled'. – user2155932

+0

Спасибо за предложение, я попробую так и сообщит о результатах .. о перерисовке, вы правы, но Qt также делает оптимизацию вокруг последовательных вызовов update()/redraw(), чтобы минимизировать рисование .. поэтому не очевидно, что два обновления будут быть отделенными красками. Но в вашем решении я считаю, что это так. Любые хорошие идеи о стиле сетки на ячейку? =) – evilruff

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

  • Нет связанных вопросов^_^