QPushButton не учитывает изменения режима QIcon - PullRequest
0 голосов
/ 11 января 2020

При применении QIcon с QPushButton::setIcon() кажется, что изменения режима не учитывают изменения режима, установленные для QIcon

QIcon helpIcon;
helpIcon.addPixmap(QPixmap(":/icons/style/help.png"), QIcon::Normal);
helpIcon.addPixmap(QPixmap(":/icons/style/help_hover.png"), QIcon::Active); //ignored?

QPushButton *myButton = new QPushButton(this);
myButton->setIcon(helpIcon);

То, что я ожидал бы получить, это значок должен меняться с одного растрового изображения на другое, когда кнопка наведена. Вместо этого значок остается прежним. Изменяется только при нажатии кнопки. Я пробовал каждую комбинацию QIcon::State и QIcon::Mode без изменений.

Запуск Qt 5.12.1

1 Ответ

0 голосов
/ 11 января 2020

Это просто то, как QPushButton обрабатывает состояния (и, следовательно, режим / состояние значка), что отличается от QToolButton. Более конкретно, это то, как текущий подкласс QStyle использует информацию о состоянии кнопки для рисования значка. Например, вот код QPushButton::paintEvent() (следите за ним, чтобы увидеть вызов initStyleOption(), где инициализируются данные состояния), затем параметры стиля передаются в настоящее время активному QStyle (который может быть например, WindowsVista / Macintosh / Fusion / StyleSheets в зависимости от ОС или настроек). Затем, если мы посмотрим, например, соответствующий QFusionStyle код , мы увидим, что режим icon Active используется только тогда, когда кнопка имеет фокус . Или то же самое в QCommonStyle (к которым все стили Windows / WindowsVista / Macinto sh все возвращаются).

Чтобы обойти это, вы можете использовать CSS и установить image свойство для состояния QPushButton:hover или реализуйте свой собственный метод QProxyStyle::drawControl() для элемента управления CE_PushButtonLabel.

CSS: QPushButton:hover { image: url(/path/to/icon.png); }

...