如何将 QStyleOptionButton 设置为带有自定义图标的复选框
How to set QStyleOptionButton like a checkbox with custom icons
我有一个继承自 QStyledItemDelegate
的自定义 Delegate
class。在它的 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);
在我 运行 我的程序的那一刻,按钮有一个闭着眼睛的图标。是否有控制显示哪个图标的命令?如果我的初始布局无法实现,正确的方向是什么?
编辑:我发现了如何select使用哪个图标来模拟复选框的外观。相反,如果第 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
自己,因为它是不断的参考。有任何想法如何去做,或者如何绕过它吗?
您可以尝试这样的操作:
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 Used to indicate if the widget is
sunken or pressed.
最后,我想出了如何设置特定标志然后对其进行测试,看看按钮是否改变了图标。
所以,对于图标更改,正如我在编辑问题时提到的,我必须使用类似的东西:
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;
}
}
现在要使用设置标志,我们在设置 buttonVis.state
之前的 paint()
事件中执行此操作:
bool isChanged = index.data(Qt::UserRole).toBool();
通过添加这些步骤,我的 QStyleOptionButton
现在表现得像一个复选框,但它会根据状态更改图标。
我有一个继承自 QStyledItemDelegate
的自定义 Delegate
class。在它的 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);
在我 运行 我的程序的那一刻,按钮有一个闭着眼睛的图标。是否有控制显示哪个图标的命令?如果我的初始布局无法实现,正确的方向是什么?
编辑:我发现了如何select使用哪个图标来模拟复选框的外观。相反,如果第 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
自己,因为它是不断的参考。有任何想法如何去做,或者如何绕过它吗?
您可以尝试这样的操作:
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 Used to indicate if the widget is sunken or pressed.
最后,我想出了如何设置特定标志然后对其进行测试,看看按钮是否改变了图标。
所以,对于图标更改,正如我在编辑问题时提到的,我必须使用类似的东西:
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;
}
}
现在要使用设置标志,我们在设置 buttonVis.state
之前的 paint()
事件中执行此操作:
bool isChanged = index.data(Qt::UserRole).toBool();
通过添加这些步骤,我的 QStyleOptionButton
现在表现得像一个复选框,但它会根据状态更改图标。