我正试图支持我的应用程序的主题化,我遇到了一个问题,我必须根据QPushButton的状态更改图标(默认、悬停、按下等等)。下面是我用来设置QPushButton图标的内容:
QPushButton#playButton {
qproperty-icon: url(":/light/icons/play_light.png");
}由于悬停状态使用的背景需要来自黑暗主题的图标,所以我尝试使用以下方法将其更改为另一个:
QPushButton#playButton:hover {
qproperty-icon: url(":/dark/icons/play_dark.png");
}当我这样做时,play_light.png会显示它应该显示的内容,但是在状态更改时它不会更改为play_dark.png。
在Python代码中,播放按钮在播放时更改为停止按钮,因此在我的风格中,我使用自定义属性将其设置为该图标:
QPushButton#playButton[isPlaying="true"] {
qproperty-icon: url(":/light/icons/stop_light.png");
}这对我来说也不会改变。因此,我在网上找到了一些代码来重置按钮的样式,如下所示:
self.ui.playButton.setProperty('isPlaying', not isEnable)
self.ui.playButton.setStyle(qApp.style())我不想为、每个、每个的单个按钮、每个的单个状态更改使用这个解决方案。你们以前遇到过这个问题吗?
谢谢你花时间看这个。
发布于 2021-12-29 00:06:48
根据经验,在样式表中使用Q_PROPERTY设置的所有变量似乎都是持久的状态,而只能设置一次。
例如,如果您添加了一个自定义边框半径并设置了这样的样式表,您将看到圆角边沿,然后设置一个空样式表,您将发现小部件更改回原来的样子。但是对于“qproperty xxx”,一旦设置了它,如果没有显式更新,它就不会改变。此外,“qproperty xxx”只能在默认选择器中设置。
将QToolButton继承为MyToolButton,以下是主要代码:
Q_PROPERTY(QIcon iconUp READ iconUp WRITE setIconUp NOTIFY iconChanged)
Q_PROPERTY(QIcon iconOver READ iconOver WRITE setIconOver NOTIFY iconChanged)
Q_PROPERTY(QIcon iconDown READ iconDown WRITE setIconDown NOTIFY iconChanged)
Q_PROPERTY(QIcon iconUpChecked READ iconUpChecked WRITE setIconUpChecked NOTIFY iconChanged)
Q_PROPERTY(QIcon iconOverChecked READ iconOverChecked WRITE setIconOverChecked NOTIFY iconChanged)
Q_PROPERTY(QIcon iconDownChecked READ iconDownChecked WRITE setIconDownChecked NOTIFY iconChanged)
protected:
QIcon m_iconUp;
QIcon m_iconOver;
QIcon m_iconDown;
QIcon m_iconUpChecked;
QIcon m_iconOverChecked;
QIcon m_iconDownChecked;
signals:
void iconChanged();
bool event(QEvent *event) override {
switch (event->type()) {
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseButtonDblClick:
case QEvent::Enter:
case QEvent::Leave:
reloadIcon();
break;
default:
break;
}
return QToolButton::event(event);
}
void checkStateSet() override {
reloadIcon();
}
void reloadIcon() {
if (isChecked()) {
if (isDown() && !m_iconDownChecked.isNull()) {
setIcon(m_iconDownChecked);
return;
} else if (underMouse() && !m_iconOverChecked.isNull()) {
setIcon(m_iconOverChecked);
return;
} else if (!m_iconUpChecked.isNull()) {
setIcon(m_iconUpChecked);
return;
}
}
if (isDown() && !m_iconDown.isNull()) {
setIcon(m_iconDown);
return;
} else if (underMouse() && !m_iconOver.isNull()) {
setIcon(m_iconOver);
return;
} else if (!m_iconUp.isNull()) {
setIcon(m_iconUp);
return;
} else {
setIcon(QIcon());
}
}样式表示例:
MyToolButton {
qproperty-iconUp: url(:/images/up.svg);
qproperty-iconOver: url(:/images/hover.svg);
qproperty-iconDown: url(:/images/pressed.svg);
}发布于 2013-12-13 23:51:09
弄明白了。我将图标保存在表单上,以便知道哪些图标指向哪个图标,但在样式表中,我做了如下操作:
QPushButton#searchNext {
qproperty-icon: none;
image: url(":/light/icons/down_light.png");
}然后在我的悬停:
QPushButton#searchNext:hover {
image: url(":/dark/icons/down_dark.png");
}在更改自定义属性时,我仍然需要self.ui.playButton.setStyle(qApp.style())代码,但对于其他所有内容,这都很好。
发布于 2014-01-13 10:57:01
设置qApp.style()不是一个好主意。试试这个(从C++转换):
button->style()->unpolish(button);
button->style()->polish(button);
button->update();https://stackoverflow.com/questions/20573944
复制相似问题