2016-12-22 5 views
1

В моем проекте я показываю QMenu с несколькими объектами QAction. Я хочу, чтобы значок QAction изменился, когда пользователь на него нависал.Значок QAction Change on Hover

Вот мой текущий код:

QPixmap icons(":/icons/platformIcons.png"); 

QIcon icon; 
icon.addPixmap(icons.copy(0, 0, 16, 16), QIcon::Selected, QIcon::On); 
icon.addPixmap(icons.copy(0, 16, 16, 16), QIcon::Selected, QIcon::Off); 

ui->actionOpen->setIcon(icon); 

Однако значок не изменяется, когда пользователь парит над QAction. Я пробовал режимы Normal и Active, и результат будет таким же. Если я переключаю состояния, значок меняется на обратный, но все равно не изменяется при наведении (или нажмите на это).

Спасибо за ваше время.

ответ

1

Поддержка зависания обычных/активных значков в меню и панелях инструментов, по-видимому, зависит от стиля платформы и, в частности, не поддерживается встроенным стилем Mac, даже если отключено использование собственной панели меню (т. Е. Отображение меню в верхней части рабочего стола, а не в окне приложения).

Я сделал быструю попытку с формой конструктора Qt на Mac тиражировать ваш случай использования (в основном заканчивается в том же C++ код, использующий QIcon::addPixmap()):

?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>300</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralWidget"/> 
    <widget class="QMenuBar" name="menuBar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>22</height> 
    </rect> 
    </property> 
    <property name="nativeMenuBar"> 
    <bool>false</bool> 
    </property> 
    <widget class="QMenu" name="menuYo"> 
    <property name="title"> 
    <string>Yo</string> 
    </property> 
    <addaction name="actionFoo"/> 
    <addaction name="actionBar"/> 
    </widget> 
    <addaction name="menuYo"/> 
    </widget> 
    <widget class="QToolBar" name="mainToolBar"> 
    <attribute name="toolBarArea"> 
    <enum>TopToolBarArea</enum> 
    </attribute> 
    <attribute name="toolBarBreak"> 
    <bool>false</bool> 
    </attribute> 
    <addaction name="actionFoo"/> 
    <addaction name="actionBar"/> 
    </widget> 
    <widget class="QStatusBar" name="statusBar"/> 
    <action name="actionFoo"> 
    <property name="checkable"> 
    <bool>true</bool> 
    </property> 
    <property name="icon"> 
    <iconset> 
    <normaloff>../red-circle.png</normaloff> 
    <normalon>../greeb-circle.png</normalon> 
    <activeoff>../red-square.png</activeoff> 
    <activeon>../green-square.png</activeon>../red-circle.png</iconset> 
    </property> 
    <property name="text"> 
    <string>Foo</string> 
    </property> 
    </action> 
    <action name="actionBar"> 
    <property name="text"> 
    <string>Bar</string> 
    </property> 
    </action> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

При использование по умолчанию Mac стиля в , Я получаю значок красного/зеленого круга в меню и на панели инструментов даже при наведении мыши. Однако, если я применяю другой стиль, например. ui->menuYo->setStyle(QStyleFactory::create("fusion"));, тогда зависание работает, но меню больше не выглядит родным ...

+0

Я не использую Mac, и ни мои пользователи. Только Windows. Должен ли я ожидать, что он будет работать в Windows с тем, как я это сделал? Кроме того, мои изображения получены из одного большого изображения, поэтому использование Qt Designer не будет работать для моего использования. – mrg95

+1

У меня нет машины Windows, поэтому я не могу точно сказать, будет ли она работать с родным стилем. Но, по крайней мере, исходя из вашего подхода, он должен работать. Просто имейте в виду, что 'QIcon :: Selected' не относится к меню. Вы хотите использовать 'QIcon :: Normal' (== unhovered) и' QIcon :: Active' (== hovered), тогда как 'QIcon :: Off' и' QIcon :: On' применяются только к проверяемым действиям (т.е. которые имеют проверенное/непроверенное состояние). Один из способов проверить, является ли это вашим кодом или стилем, чтобы запустить приложение с аргументом '-style fusion', который использует стиль виджета Fusion. Это гарантированно работает, если код правильный –

+0

AH! Проблема состояла в том, что мне нужно было установить оба состояния в 'QIcon :: Off'. Я не понимал, что это связано с проверкой или нет. Благодаря :) – mrg95