gpt4 book ai didi

python - 使用 Qt 样式表更改状态更改时的图标

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:40 25 4
gpt4 key购买 nike

我正在尝试支持我的应用程序的主题,但遇到了一个问题,我必须根据 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())

我不想对每个单个按钮使用此解决方法来更改每个单个状态。你们以前遇到过这个问题吗?

感谢您花时间查看此内容。

最佳答案

根据经验,所有可以在样式表中使用 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);
}

关于python - 使用 Qt 样式表更改状态更改时的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com