以编程方式将Qt鼠标悬停按钮突出显示在任何按钮上

时间:2018-08-22 08:59:10

标签: c++ qt

在Windows的Qt应用程序中,当鼠标指针悬停在QPushButton上时,它将以闪烁的轮廓突出显示。

我想以编程方式告诉任何QPushButton突出显示的内容,而无需将鼠标光标悬停在上面。

这可能吗?我尝试将焦点设置为按钮并使用了不同的样式表,但是似乎无法访问鼠标悬停的轮廓效果。

1 个答案:

答案 0 :(得分:2)

解决方案

如果要模拟,一个按钮一直在鼠标的下面,我的解决方案是从 QPushButton 继承并重新实现paintEvent方法,显式设置按钮的状态到QStyle::State_MouseOver

option.state |= QStyle::State_MouseOver;

注意:请注意,此解决方案将对不同的操作系统产生不同的影响,因为它们使用不同的方式来指示悬停的按钮。例如,在Windows 7下,整个按钮将突出显示,而不是添加发光的边框。


背景

QPushButton QStylePainter 绘制,如source code所示:

void QPushButton::paintEvent(QPaintEvent *)
{
    QStylePainter p(this);
    QStyleOptionButton option;
    initStyleOption(&option);
    p.drawControl(QStyle::CE_PushButton, option);
}

按钮的绘制方式由QStyleOptionButton中的设置决定,QStyleOptionstate flags的子类。 QStyleOption依次具有公共state属性,该属性保存绘制按钮时使用的GitHub。标志QStyle::State_MouseOver用于指示按钮在鼠标下方。


示例

最后,这是您可以尝试的示例:

GlowyButton.cpp 中:

#include "GlowyButton.h"
#include <QStylePainter>
#include <QStyleOptionButton>

...

void GlowyButton::paintEvent(QPaintEvent * /*event*/)
{
    QStylePainter p(this);
    QStyleOptionButton option;
    initStyleOption(&option);
    option.state |= QStyle::State_MouseOver;
    p.drawControl(QStyle::CE_PushButton, option);
}

...

可以从enter image description here下载示例的完整代码。