编辑:注意,这只有在按钮在子菜单中时才会发生。(菜单中的菜单。)此代码仅在父菜单上运行良好!
在Windows7上运行QT5.0.2,我有一个QMenu,里面有一个QWidgetAction。QWidgetAction内部有一个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_Hmain.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}但是,当光标在QPushButton上盘旋时,背景色不会改变。不管我是否以融合的方式运行它。
这里发生什么事情?耽误您时间,实在对不起。
发布于 2017-04-10 09:32:54
这听起来像是小部件上没有启用mouseTracking (和/或可能是在父小部件上)。您可以通过调用
QWidget::setMouseTracking(bool enable);发布于 2017-04-17 07:27:11
如何解决:使用一些非默认样式,例如:
const auto fusion = QStyleFactory::create( "Fusion" );
QApplication::setStyle( fusion );QPushButton不是为完美地处理悬停事件而设计的。例如,悬浮事件不会通过样式表更改字体。如何解决:使用QToolButton代替。
不知道为什么不适合你。对我来说一切都好..。
更新
只需复制粘贴并运行:
#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();
}

https://stackoverflow.com/questions/43303571
复制相似问题