Каков наилучший способ сделать так, чтобы ячейки QTableView имели в Qt нажатие кнопок вверх и вниз? - PullRequest
0 голосов
/ 09 июня 2009

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

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

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

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

Ответы [ 7 ]

1 голос
/ 10 июня 2009

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

Как то так ...

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.backgroundBrus h является правильным в методе sizeHint, но недопустимым в методе paint. Теперь я вижу причину, по которой sizeHint должен иметь кисть фона, а метод paint - нет. Я сообщу об этом в Nokia.

EDIT:

Похоже, я был прав, и это ошибка в QStyleOptionViewItemV4 не копирует значок и backgroundBrush

1 голос
/ 09 июня 2009

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

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

0 голосов
/ 18 сентября 2012

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

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

0 голосов
/ 26 июля 2009

Я не уверен, откуда исходит требование для фонового изображения. Если вы хотите, чтобы ячейки выглядели как QPushButton s, вам, вероятно, следует наследовать от 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 );
0 голосов
/ 18 июня 2009

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

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

0 голосов
/ 09 июня 2009

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

0 голосов
/ 09 июня 2009

Разве вы не можете получить ID / количество строк в строке ячейки таблицы, а затем сравнить ее с таблицей цветов, которая у вас может быть, и соответственно установить цвет? Я не уверен, хорошо ли я понял ваш вопрос.

...