0

我有一个自定义Delegate类,它继承自QStyledItemDelegate. 在这种paint()情况下,我想补充一下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,因为它是不断的参考。任何想法如何做到这一点,或如何解决它?

4

2 回答 2

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 用于指示小部件是凹陷还是按下。

于 2016-03-15T21:30:40.537 回答
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现在的行为就像一个复选框,但它会将图标更改为状态。

于 2016-04-22T16:23:16.877 回答