QPushButton在子QMenu中,改变hover的背景

编辑: 注意只有当button在SUBMENU时才会发生。 (菜单中的菜单。)此代码仅在父菜单上正常工作!

Windows 7上运行Qt 5.0.2。我有一个QMenuQWidgetActionQWidgetAction里面是一个QPushButton 。 当鼠标hover在它上面时,我想改变button的背景颜色。

这是我的代码:

 #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(); } 

但是,当光标hover在QPushButton ,背景颜色不会更改。 没关系,如果我运行融合风格或不。

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

这个声音像mouseTracking没有启用的部件(和/或可能在父窗口小部件)。 您可以通过调用启用它

 QWidget::setMouseTracking(bool enable); 
  1. 如果您不更改按钮的边框样式,背景可能不会自定义。

如何解决:使用一些非默认的样式,例如:

 const auto fusion = QStyleFactory::create( "Fusion" ); QApplication::setStyle( fusion ); 
  1. QPushButton不是为完美处理悬停事件而设计的。 例如,悬停事件不会通过样式表更改字体。

如何解决:改用QToolButton

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

UPDATE

只需复制粘贴并运行:

 #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(); } 

截图