【问题标题】:Programmatically applying the Qt mouse-hover button highlighting on any button以编程方式在任何按钮上应用 Qt 鼠标悬停按钮突出显示
【发布时间】:2018-08-22 08:59:10
【问题描述】:

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

我想告诉任何 QPushButton 像这样以编程方式突出显示,而不会让鼠标光标实际悬停在它上面。

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

【问题讨论】:

  • 是 QGraphicsDropShadowEffect 你在找什么?
  • 是的,但很遗憾我现在无法验证 - 不过当时看起来很有希望。

标签: c++ qt


【解决方案1】:

解决方案

如果你想模拟一个按钮一直在鼠标下,我的解决方案是继承 QPushButton 并重新实现paintEvent 方法,将按钮的状态显式设置为@ 987654327@:

option.state |= QStyle::State_MouseOver;

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


背景

QPushButtonQStylePainter 绘制,见source code:

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

按钮的绘制方式由QStyleOptionButton 中的设置决定,QStyleOptionButtonQStyleOption 的子类。 QStyleOption 又具有一个公共的state 属性,该属性包含在绘制按钮时使用的state flags。标志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);
}

...

示例的完整代码可以从GitHub下载。

【讨论】:

  • 这是一个很好的例子,但它可能是一个文件中的 15 行,而不是这么多分散的样板:很难理解重要的内容,因为 >50% 是无关紧要的和不必要的。顺便说一句,在大多数情况下使用QMainWindow 是不正确的,因为大多数简单的应用程序不需要它提供的停靠窗口功能。非常可悲的是,Qt Creator 自带了一个模板,默认以QMainWindow 作为基础类型。大约有 0 个 SO 答案需要QMainWindow,除非问题是关于该课程的。
  • @KubaOber,我已经考虑了您在评论中所说的内容,并相应地编辑了答案。谢谢你的评论!
  • 惊人的答案@scopchanov - 谢谢!我现在会调查一下。我不知道 Woboq 代码浏览器 - 多么宝贵的资源!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多