2016-03-11 2 views
0

У меня есть пользовательский класс Delegate, который наследует от QStyledItemDelegate. В своем paint() событии я хотел бы добавить QStyleOptionButton, который должен быть проверен. Является ли это возможным?Как установить QStyleOptionButton, как флажок с пользовательскими значками

Например, это свойство видимости со значком глаза; и когда кнопка нажата, значок глаза превращается в значок закрытого глаза.

Внутри метода paint(), это мой текущий код для создания кнопки:

QStyleOptionButton buttonVis; 
buttonVis.rect = getButtonVisibilityRect(); 
buttonVis.iconSize = QSize(sizeX, sizeY); 
buttonVis.icon = icon; 
buttonVis.state = QStyle::State_Enabled; 
buttonVis.features = QStyleOptionButton::None; 

QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonVis, painter); 

значок, который я загружаю в buttonVis создана:

QIcon icon; 
icon.addPixmap(QPixmap(":/control-visibility.svg"), QIcon::Normal, QIcon::On); 
icon.addPixmap(QPixmap(":/control-visibilityNo.svg"), QIcon::Normal, QIcon::Off); 

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

EDIT: Я узнал, как выбрать, какой значок использовать, чтобы имитировать вид флажка. Вместо этого, если линия buttonVis.state = QStyle::State_Enabled; должна быть:

if (/* current item checkbox checked? */) 
    buttonVis.state = QStyle::State_Enabled | QStyle::State_On; 
else 
    buttonVis.state = QStyle::State_Enabled | QStyle::State_Off; 

Проблема теперь выяснить, что это такое состояние или как установить его из editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index). Проблема в том, что я не могу изменить option сам, так как это постоянная ссылка. Любые идеи, как это сделать, или как обойти это?

ответ

0

Наконец-то я выяснил, как настроить определенный флаг, а затем проверить его и посмотреть, изменилась ли кнопка.

Таким образом, для изменения иконок, как я уже говорил на редактирование моего вопроса, я должен использовать что-то вроде:

buttonVis.state |= QStyle::State_Enabled; 
buttonVis.state |= isChanged? QStyle::State_Off : QStyle::State_On; 

Так что нисходит о том, как настроить isChanged флаг. И это может быть сделано в рамках editorEvent() метода делегата:

bool Delegate::editorEvent(QEvent *event, QAbstractItemModel *model, const StyleOptionViewItem &option, const QModelIndex &index) 
{ 
    if (/* event is release and it is over the button area*/) 
    { 
     bool value = index.data(Qt::UserRole).toBool(); 
     // this is how we setup the condition flag 
     model->setData(index, !value, Qt::UserRole); 
     return true; 
    } 
} 

Теперь, чтобы использовать флаг установки, мы делаем это в paint() случае перед нами созданы buttonVis.state:

bool isChanged = index.data(Qt::UserRole).toBool(); 

Добавляя эти шаги мой QStyleOptionButton теперь ведет себя как флажок, но он меняет значки как состояния.

0

Вы можете попробовать что-то вроде этого:

QStyleOptionButton option; 
option.initFrom(this); 
... 
QStylePainter p(this); 
if (option.state.testFlag(QStyle::State_Sunken)) { 
    p.drawPixmap(this->rect(), QPixmap(":/control-visibility")); 
} else { 
    p.drawPixmap(this->rect(), QPixmap(":/control-visibilityNo")); 
} 

Будьте осторожны с SVG-файла, попробуйте сначала PNG.

QStyle :: State_Sunken 0x00000004 Используется для указания, если виджет затонувших или нажата.

+0

благодарит за ответ. Я нашел, как переключать значки: 'buttonVis.state = QStyle :: State_Enabled | QStyle :: State_Off; 'или' buttonVis.state = QStyle :: State_Enabled | QStyle :: State_On; '. Я попробовал ваше предложенное условие 'option.state.testFlag (QStyle :: State_Sunken) ', но это не похоже на трюк. Кажется, что этот флаг не установлен, когда я нажимаю на свою кнопку, и я не уверен, как заставить его автоматически переключать состояния. В редакторе 'editorEvent' я могу проверить, когда я нажимаю на кнопку, однако я не могу изменить' option', поскольку он передается как 'const &'. – vicrucann

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