子QMenu中的QPushButton,在悬停时更改背景

时间:2017-04-09 05:58:28

标签: c++ windows qt qtstylesheets qmenu

编辑: 注意这仅在按钮位于SUBMENU中时才会出现。 (菜单中的菜单。)此代码仅在父菜单上正常工作!

在Windows 7上运行Qt 5.0.2。我有一个QMenu,其中包含QWidgetActionQWidgetAction内部是QPushButton。当鼠标悬停在按钮上时,我想改变按钮的背景颜色。

这是我的代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMenu>
#include <QWidgetAction>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QMenu menu;
    QMenu *subMenu = new QMenu("SubMenu text");

    QWidgetAction *widgetAction = new QWidgetAction(subMenu);
    QPushButton *btn = new QPushButton("test");
    btn->setStyleSheet("QPushButton:hover{background-color: #ff0000;}");
    widgetAction->setDefaultWidget(btn);
    subMenu->addAction(widgetAction);

    menu.addMenu(subMenu);
    menu.exec();
}

·H

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

的main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}

然而,当光标悬停在QPushButton上时,背景颜色不会改变。如果我以融合风格运行它并不重要。

这里发生了什么?谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

在窗口小部件上(和/或可能在父窗口小部件上)未启用类似mouseTracking的声音。您可以通过调用

启用它
QWidget::setMouseTracking(bool enable);

答案 1 :(得分:0)

  1. 如果您不更改按钮的边框样式,则可能无法自定义背景。
  2. 如何解决:使用一些非默认样式,例如:

    const auto fusion = QStyleFactory::create( "Fusion" );
    QApplication::setStyle( fusion );
    
    1. QPushButton不适用于完美处理悬停事件。例如,悬停事件不会通过样式表更改字体。
    2. 如何解决:改为使用QToolButton

      P.S。不知道,为什么它不适合你。一切都对我好......

      更新

      只需复制粘贴并运行:

      #include <QApplication>
      #include <QWidgetAction>
      #include <QMenu>
      #include <QPushButton>
      #include <QToolButton>
      #include <QStyleFactory>
      
      
      void showMenu()
      {
          const auto parent = qApp->activeWindow();
          auto menu = new QMenu( parent );
      
          auto root = new QMenu( "Root", menu );
          menu->addMenu( root );
      
          auto wa = new QWidgetAction( parent );
          auto tb = new QToolButton;
          tb->setText( "ToolBtn" );
          wa->setDefaultWidget( tb );
      
          root->addAction( wa );
      
          menu->exec( QCursor::pos() );
          menu->deleteLater();
      }
      
      
      int main(int argc, char *argv[])
      {
          QApplication a( argc, argv );
      
          const auto fusion = QStyleFactory::create( "Fusion" );
          const auto qss =
              "QToolButton:!hover{background-color: #00ff00;}"
              "QToolButton:hover{background-color: #ff0000;}"
              ;
      
          QApplication::setStyle( fusion );
          qApp->setStyleSheet( qss );
      
          QWidget w;
          w.resize( 800, 600 );
          auto btn = new QPushButton{ "Test", &w };
      
          QObject::connect( btn, &QPushButton::clicked, &showMenu );
          w.show();
      
          return a.exec();
      }
      

      Screenshot