2016-03-11 1049 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); 

对于那一刻,我运行我的程序,该按钮有一个闭着眼睛的图标。是否有命令来控制显示哪个图标?如果我的初始布局不可能实现,那么正确的方向是什么?

编辑:我发现如何选择使用哪个图标来模拟复选框外观。相反,如果线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文件,与巴第一次尝试。

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

相关问题