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