首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPushButton在子QMenu中,在悬停时更改背景

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

Stack Overflow用户
提问于 2017-04-09 05:58:27
回答 2查看 1.6K关注 0票数 0

编辑:注意,这只有在按钮在子菜单中时才会发生。(菜单中的菜单。)此代码仅在父菜单上运行良好!

在Windows7上运行QT5.0.2,我有一个QMenu,里面有一个QWidgetActionQWidgetAction内部有一个QPushButton。当鼠标悬停在按钮上时,我想改变按钮的背景色。

这是我的代码:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include "mainwindow.h"
#include <QApplication>

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

    w.show();

    return a.exec();
}

但是,当光标在QPushButton上盘旋时,背景色不会改变。不管我是否以融合的方式运行它。

这里发生什么事情?耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

发布于 2017-04-10 09:32:54

这听起来像是小部件上没有启用mouseTracking (和/或可能是在父小部件上)。您可以通过调用

代码语言:javascript
复制
QWidget::setMouseTracking(bool enable);
票数 0
EN

Stack Overflow用户

发布于 2017-04-17 07:27:11

  1. 如果不更改按钮的边框样式,则可能无法自定义背景。

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

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

如何解决:使用QToolButton代替。

不知道为什么不适合你。对我来说一切都好..。

更新

只需复制粘贴并运行:

代码语言:javascript
复制
#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();
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43303571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档