首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qt样式表更改状态时的更改图标

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

Stack Overflow用户
提问于 2013-12-13 18:55:48
回答 3查看 4.5K关注 0票数 2

我正试图支持我的应用程序的主题化,我遇到了一个问题,我必须根据QPushButton的状态更改图标(默认、悬停、按下等等)。下面是我用来设置QPushButton图标的内容:

代码语言:javascript
复制
QPushButton#playButton {
    qproperty-icon: url(":/light/icons/play_light.png");
}

由于悬停状态使用的背景需要来自黑暗主题的图标,所以我尝试使用以下方法将其更改为另一个:

代码语言:javascript
复制
QPushButton#playButton:hover {
    qproperty-icon: url(":/dark/icons/play_dark.png");
}

当我这样做时,play_light.png会显示它应该显示的内容,但是在状态更改时它不会更改为play_dark.png

在Python代码中,播放按钮在播放时更改为停止按钮,因此在我的风格中,我使用自定义属性将其设置为该图标:

代码语言:javascript
复制
QPushButton#playButton[isPlaying="true"] {
    qproperty-icon: url(":/light/icons/stop_light.png");
}

这对我来说也不会改变。因此,我在网上找到了一些代码来重置按钮的样式,如下所示:

代码语言:javascript
复制
self.ui.playButton.setProperty('isPlaying', not isEnable)
self.ui.playButton.setStyle(qApp.style())

我不想为、每个、每个的单个按钮、每个的单个状态更改使用这个解决方案。你们以前遇到过这个问题吗?

谢谢你花时间看这个。

EN

回答 3

Stack Overflow用户

发布于 2021-12-29 00:06:48

根据经验,在样式表中使用Q_PROPERTY设置的所有变量似乎都是持久的状态,而只能设置一次

例如,如果您添加了一个自定义边框半径并设置了这样的样式表,您将看到圆角边沿,然后设置一个空样式表,您将发现小部件更改回原来的样子。但是对于“qproperty xxx”,一旦设置了它,如果没有显式更新,它就不会改变。此外,“qproperty xxx”只能在默认选择器中设置。

将QToolButton继承为MyToolButton,以下是主要代码:

代码语言:javascript
复制
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());
    }
}

样式表示例:

代码语言:javascript
复制
MyToolButton {
    qproperty-iconUp: url(:/images/up.svg);
    qproperty-iconOver: url(:/images/hover.svg);
    qproperty-iconDown: url(:/images/pressed.svg);
}
票数 1
EN

Stack Overflow用户

发布于 2013-12-13 23:51:09

弄明白了。我将图标保存在表单上,以便知道哪些图标指向哪个图标,但在样式表中,我做了如下操作:

代码语言:javascript
复制
QPushButton#searchNext {
    qproperty-icon: none;
    image: url(":/light/icons/down_light.png"); 
}

然后在我的悬停:

代码语言:javascript
复制
QPushButton#searchNext:hover {
    image: url(":/dark/icons/down_dark.png");   
}

在更改自定义属性时,我仍然需要self.ui.playButton.setStyle(qApp.style())代码,但对于其他所有内容,这都很好。

票数 0
EN

Stack Overflow用户

发布于 2014-01-13 10:57:01

设置qApp.style()不是一个好主意。试试这个(从C++转换):

代码语言:javascript
复制
button->style()->unpolish(button);
button->style()->polish(button);
button->update();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20573944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档