【问题标题】:QAction Icon Change on Hover悬停时 QAction 图标更改
【发布时间】:2016-12-22 15:48:27
【问题描述】:

在我的项目中,我显示了一个带有多个 QAction 对象的 QMenu。我希望QAction 图标在用户将鼠标悬停在它上面时发生变化。

这是我当前的代码:

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 上时,图标不会改变。我试过NormalActive 模式,结果是一样的。如果我切换状态,图标会反转,但在悬停时仍然不会改变(或单击)。

感谢您的宝贵时间。

【问题讨论】:

    标签: c++ qt qaction


    【解决方案1】:

    对悬停在菜单和工具栏中的普通/活动图标的支持似乎取决于平台样式,尤其是本机 Mac 样式不支持,即使禁用本机菜单栏的使用(即菜单显示在桌面顶部而不是应用程序窗口内)。

    我在 Mac 上使用 Qt Designer 表单快速尝试了复制您的用例(基本上使用 QIcon::addPixmap() 以相同的 C++ 代码结束):

    ?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-&gt;menuYo-&gt;setStyle(QStyleFactory::create("fusion")); 然后悬停工作,但菜单看起来不再是原生的......

    【讨论】:

    • 我没有使用 Mac,我的用户也不会。仅限窗户。我应该期望它以我的方式在 Windows 上工作吗?另外,我的图片来源于一张大图片,所以使用 Qt Designer 不适用于我的用例。
    • 我手边没有一台 Windows 机器,所以我无法确定它是否适用于原生样式。但至少根据您的方法,它应该可以工作。请注意,QIcon::Selected 不适用于菜单。您想要的是QIcon::Normal(== 未悬停)和QIcon::Active(== 悬停),而QIcon::OffQIcon::On 仅适用于可检查的操作(即具有已检查/未检查状态的操作)。测试它是您的代码还是样式的一种方法是使用使用 Fusion 小部件样式的参数 -style fusion 运行应用程序。如果代码是正确的,那一个保证可以工作
    • 啊!问题是我需要将两个状态都设置为QIcon::Off。我没有意识到这与是否被检查有关。谢谢:)
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2020-07-23
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多