Изменить значок при изменении состояния с помощью таблицы стилей Qt

Я пытаюсь поддержать их для своего приложения, и я сталкиваюсь с проблемой, когда мне приходится менять значки в зависимости от состояния 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())

Я не хочу использовать этот обходной путь для каждой кнопки для каждого изменения состояния. Ребята, вы сталкивались с этой проблемой раньше?

Спасибо за ваше время, глядя на это.

3 ответа

Установка qApp.style() не очень хорошая идея. Попробуйте это (конвертировать из C++):

button->style()->unpolish(button);
button->style()->polish(button);
button->update();

По опыту, все переменные, которые можно установить с помощью 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);
}

Догадаться. Я сохранил значки в своей форме, чтобы я знал, какие значки были переданы, но в своей таблице стилей я сделал что-то вроде этого:

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()) код, когда я изменяю пользовательское свойство, но для всего остального, это работает нормально.

Другие вопросы по тегам