Каков наилучший способ заставить ячейки QTableView иметь состояния нажатия кнопок вверх и вниз в Qt?

StackOverflow https://stackoverflow.com/questions/970618

Вопрос

Я пытаюсь создать клетки QTableView выглядят как трехмерные кликабельные кнопки.Чтобы при нажатии на ячейку кнопка выглядела нажатой. Кажется, все думают, что я просто хочу изменить цвет, мне нужно показать изображения обычной кнопки и нажатой кнопки, которые выглядят трехмерными.

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

Я могу установить цвет кнопки с помощью TableModel, но как только кнопка нажата, нет возможности ItemDelegate знать, что он должен быть другого цвета, чем остальные.Как вы можете связать эти два понятия, чтобы ItemDelegate знает, какого цвета он должен быть?

Кроме того, есть ли лучший способ сделать ячейки похожими на кнопки?

Это было полезно?

Решение

Вы можете позвонить QModelIndex::model() изнутри ItemDelegate's paint() метод, поскольку он имеет QModelIndex параметр.Это дает вам TableModel для данных, для которых вы можете программно решить, какого цвета будет кнопка ячейки.

Однако это все еще не так элегантно, как хотелось бы.Кто-нибудь знает лучший способ изменить внешний вид ячеек таблицы, когда они находятся в состояниях нажатия кнопки «вверх» и «вниз»?

Другие советы

Почему бы вам не спросить у индекса цвет фона.

Что-то вроде этого ...

QStyleOptionToolButton buttonOption;
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option);
//...
buttonOption.palette.setBrush( QPalette::Button, index.data( Qt::BackgroundColorRole ) ); 
//...

У меня такое ощущение, что это ошибка в Qt, и, должно быть, это было...

// model code  
if(role==Qt::BackgroundColorRole )
    return qvariant_cast<QBrush>( QBrush(Qt::red) );

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush );

Поскольку optionV4.backgroundBrush правильный в sizeHint метод, но недействителен в paint метод .Теперь я понимаю, почему sizeHint должна иметь фоновую кисть и paint метод нет.Я сообщу об этом в Nokia.

РЕДАКТИРОВАТЬ:

Похоже, я был прав, и это ошибка в <Qt4.5.
QStyleOptionViewItemV4 не копирует значок и фоновую кисть

Можете ли вы получить идентификатор/количество строк ячейки таблицы, а затем проверить его на соответствие таблице цветов, которая у вас может быть, и установить цвет соответствующим образом?Я не уверен, хорошо ли я понял ваш вопрос или нет.

Назначьте роль данных для цвета фона и в делегате элемента спросите индекс модели, какой у него цвет фона (используя data( bg_color_role ) или что-то подобное).Затем в вашей модели вам необходимо убедиться, что функция данных возвращает цвет для bg_color_role который соответствует моделируемым данным.

Способ сделать это — использовать метод данных объекта QModelIndex, который вы получаете в методе рисования, и запросить конкретную роль (если вы определяете пользовательскую модель, вы можете добавить свои собственные роли и предоставить необходимую информацию). делегат в этих ролях.)

ТимВ, я думаю, тебе нужно заполнить информацию QStyleOptionViewItemV4, предварительно вызвав initStyleOption.

Я не уверен, откуда взялось требование к фоновому изображению.Если вы хотите, чтобы ячейки выглядели как QPushButtons, вам, вероятно, следует наследовать от QItemDelegate и реализовать paint() использовать QStyle нарисовать тебе QPushButton, что-то вроде этого:

QStyleOptionButton opt;
// fill 'opt' from the information from the model, and the style option that's passed in
style()->drawControl( QStyle::CE_PushButton, &opt, painter );

Пробовали ли вы использовать собственные таблицы стилей?

Вы можете просто применить одну и ту же таблицу стилей к каждой ячейке, а затем изменить фоновое изображение/стиль для рисования изображений трехмерных кнопок в зависимости от того, выбрано оно или нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top