如何在 Qt 中实现 QHoverEvent?

2024-04-21

我正在学习 Qt 和 C++。我已经成功地实现了信号和槽来捕获标准事件,例如ButtonPushed()等等。但是,我希望当我将鼠标悬停在鼠标上并移出鼠标时调用一个函数QLabel。看起来像QHover事件 http://doc.qt.io/qt-4.8/qhoverevent.html会做我需要的事情,但我似乎找不到任何关于如何实现这一点的教程或示例。它的实现方式与信号和槽相同吗?我试过:

connect(ui.lbl_test, SIGNAL(QHoverEvent), this, SLOT(TestFunc(QEvent::Type type, const QPoint & pos, const QPoint & oldPos)));

..但是当我将鼠标悬停在标签上时,该函数没有被调用。

这是该函数,在头文件中作为公共槽列出:

void MyDialog::TestFunc(QEvent::Type type, const QPoint & pos, const QPoint & oldPos) {
     QMessageBox::information(this, tr("Hey"), tr("Listen!"));
}

谁能帮我解决这个问题或给我指出一个很好的例子?

EDIT:

看了下面的帖子,发现没有setFlag()会员调用我的标签小部件,但我确实尝试过:

    ui.lbl_test->setMouseTracking(true);
    connect(ui.lbl_test, SIGNAL(ui.lbl_test->mouseMoveEvent()), this, SLOT(TestFunc(QMouseEvent *event)));

并更新了TestFunc()因此。但当我将鼠标悬停时仍然没有任何反应。

看完之后不太确定QLabel甚至继承了 mouseMoveEvent() 甚至来自QWidget。如果这是真的,是否有一个小部件可以做到这一点,或者有一个在某处继承它的对象列表?我从他们网站上的文档中只能知道一个对象有多少个继承的函数。


http://qt-project.org/doc/qt-5/qwidget.html#enterEvent http://qt-project.org/doc/qt-5/qwidget.html#enterEvent

http://qt-project.org/doc/qt-5/qwidget.html#leaveEvent http://qt-project.org/doc/qt-5/qwidget.html#leaveEvent

http://qt-project.org/doc/qt-5/qt.html#widget-attributes http://qt-project.org/doc/qt-5/qt.html#widget-attributes

Qt::WA_悬停

当鼠标进入或离开时强制 Qt 生成绘制事件 小部件。此功能通常在实现自定义时使用 风格;有关详细信息,请参阅样式示例。

http://qt-project.org/doc/qt-5/qtwidgets-widgets-styles-example.html#norwegianwoodstyle-class-implementation http://qt-project.org/doc/qt-5/qtwidgets-widgets-styles-example.html#norwegianwoodstyle-class-implementation

This QStyle::polish()每个绘制的小部件都会调用一次重载 使用样式。我们重新实现它来设置Qt::WA_Hover属性 在QPushButtons and QComboBoxes。设置该属性后,Qt 当鼠标指针进入或离开时生成绘制事件 小部件。这使得渲染按钮和组合框成为可能 当鼠标指针位于它们上方时,情况会有所不同。

如何接收进入和离开事件QWidget

  1. 设置 WA_Hover 的小部件属性

    // in your widget's constructor (probably)
    this->setAttribute(Qt::WA_HOVER, true);
    
  2. 实施QWidget::enterEvent() and QWidget::leaveEvent().

    void Widget::enterEvent(QEvent * event)
    {
        qDebug() << Q_FUNC_INFO << this->objectName();
        QWidget::enterEvent(event);
    }
    
    void Widget::leaveEvent(QEvent * event)
    {
        qDebug() << Q_FUNC_INFO << this->objectName();
        QWidget::leaveEvent(event);
    }
    
  3. Done

QWidget 中的 QHoverEvent

http://qt-project.org/doc/qt-5/qhoverevent.html#details http://qt-project.org/doc/qt-5/qhoverevent.html#details

http://qt-project.org/doc/qt-5/qobject.html#event http://qt-project.org/doc/qt-5/qobject.html#event

http://qt-project.org/doc/qt-5/qwidget.html#event http://qt-project.org/doc/qt-5/qwidget.html#event

// in your widget's constructor (probably)
this->setAttribute(Qt::WA_HOVER, true);
// ...

void Widget::hoverEnter(QHoverEvent * event) {qDebug() << Q_FUNC_INFO << this->objectName();}
void Widget::hoverLeave(QHoverEvent * event) {qDebug() << Q_FUNC_INFO << this->objectName();}
void Widget::hoverMove(QHoverEvent * event) {qDebug() << Q_FUNC_INFO << this->objectName();}

bool Widget::event(QEvent * e)
{
    switch(e->type())
    {
    case QEvent::HoverEnter:
        hoverEnter(static_cast<QHoverEvent*>(e));
        return true;
        break;
    case QEvent::HoverLeave:
        hoverLeave(static_cast<QHoverEvent*>(e));
        return true;
        break;
    case QEvent::HoverMove:
        hoverMove(static_cast<QHoverEvent*>(e));
        return true;
        break;
    default:
        break;
    }
    return QWidget::event(e);
}

UPDATE:

简单的例子

将鼠标悬停在按钮上即可看到计数变化。查看应用程序输出以获取更多信息。

https://gist.github.com/peteristhegreat/d6564cd0992351f98aa94f869be36f77 https://gist.github.com/peteristhegreat/d6564cd0992351f98aa94f869be36f77

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Qt 中实现 QHoverEvent? 的相关文章

随机推荐

  • 如何以最佳方式将 SQL 查询转换为 cypher?

    我是 neo4j 的新手 使用 3 0 版本 我有一个巨大的事务数据集 我将其转换为图形模型 我需要将下面的 SQL 查询转换为 cypher create table calc base as select a ticket id tic
  • 保存为自动填充对话框未显示

    我有一个显示用户名 UI 的活动 输入该活动并点击继续按钮后会显示输入密码 UI 输入密码并点击登录按钮后 完成当前活动并启动新活动 在我的设备上 我选择了 Google 自动填充服务 因此在第一个活动完成后 我想要 保存以供自动填充 对话
  • Maven AppAssembler 找不到类

    尝试修改现有的 Java Tomcat 应用程序以按照其部署在 Heroku 上tutorial https devcenter heroku com articles create a java web application using
  • has_many :autosave => true 保存子项时跳过验证

    在 Rails 2 和 Rails 3 中 如果 autosave gt true 是一个 has many 关联 则循环遍历集合并对每个子关联调用 save validate gt false 这是为什么 我们需要为该子对象运行 befo
  • 创建 SKShapeNode 的子类

    class ColorRectangle SKShapeNode var width CGFloat var height CGFloat var rectColor UIColor convenience init rectOfSize
  • 使用 NSValueTransformer 加密 iOS 核心数据

    我正在尝试使用 Core Data 和 CommonCrypto 加密数据 我正在尝试使用 NSValueTransformer 来延迟加密和解密 但是 当我现在尝试将加密数据保存到持久存储协调器时 它失败了 每次我尝试将数据保存到数据库时
  • RecyclerView - 获取 Activity 内的位置而不是 RecyclerView 适配器

    这是我处理视图点击的第三天 我原来用的是ListView 然后我切换到RecyclerView 我已经添加了android onclick我的每个控件的元素row layout我正在处理它们MainActivity像这样 public vo
  • Moment js - 获取日期而不考虑时区

    我确实阅读了不同的 StackOverflow 帖子 他们建议从一开始就使用 utc 但它不起作用 Note 我在 PST 区域 const start 2018 06 10T21 00 00 04 00 const end 2018 06
  • MS2015中的MvcBuildViews需要很长时间

    我们正在转换解决方案以使用新的 Roslyn 编译器 当我在发布模式下通过 teamCity 构建它时 MVCBuildViews 步骤仍然使用 aspnet compiler exe 并且预编译视图需要大约 15 分钟 在 NET 4 5
  • Factory_girl 与 validates_presence_of 有关系

    我有 2 个型号 user rb class User lt ActiveRecord Base has one profile dependent gt destroy end profile rb class Profile lt Ac
  • Linux 中允许的 c/c++ 最大互斥体数量

    我一直在尝试找出 Linux 中 c c 进程的最大互斥体数量是多少 但没有成功 另外 有没有办法修改这个数字 我正在读的书提到了如何找到Linux中允许的最大线程数以及如何修改这个数字 但没有提到互斥体 检查这个pthread mutex
  • Django Postgresql 在迁移时删除列默认值

    我面临表默认值的问题 例如我有这个模型 class model1 models Model field1 models CharField max length 50 default My Default Value 1 db column
  • 如何完全静音 bash 脚本中的 vlc 输出?

    我有一个为自己编写的脚本 它在接近结束的地方使用 vlc 我需要它停止输出它想要的任何内容 但保留我自己的输出 所以没有 清除 我使用了参数 q 和 no sout x264 quiet 但无济于事 它仍然输出丑陋的消息 即 警告 调用 r
  • 使用两个具有相同命名空间的 .NET 库

    我目前正在为一家公司维护一些旧代码 正如所发生的那样 我正在修改的当前应用程序使用旧版本的内部库 我们将其称为 Lib1 dll 他们还有一个名为 Lib2 dll 的新版本库 它在许多方面对以前的库进行了改进 不幸的是 Lib2 不向后兼
  • VBS 脚本 getElementbyID 错误(自动登录脚本)

    我正在编写适用于不同站点的 vbs 脚本文件 但我正在为我的大学网页编写用于互联网页面登录的自动登录脚本 所以我一直在工作直到填写用户名和密码 但我无法让它点击登录 这是大学登录的链接 我不确定您是否可以从网络外访问它 请注意编辑请不要将其
  • 从 DataReader 读取数据的通用方法

    我目前正在使用此方法从 DataReader 读取数据 private T GetValue
  • LinkedList“节点跳转”

    试图找出为什么我的list 类指针被第三个节点覆盖 插入函数 如下 中发生的情况是 第三次调用插入函数headByName gt nextByName当第三个节点应该指向第二个节点时 节点指针被第三个节点覆盖 因此 您可以猜测第 4 个节点
  • 使用 Velocity 生成基于 HTML 的电子邮件

    我尝试这个教程http www java2s com Code Java Velocity UseVelocitytogenerateHTMLbasedemail htm http www java2s com Code Java Velo
  • Tensorflow:加载预训练 ResNet 模型时出错

    我想使用 Tensorflow 中预先训练的 ResNet 模型 我下载了code https github com tensorflow models blob master research slim nets resnet v1 py
  • 如何在 Qt 中实现 QHoverEvent?

    我正在学习 Qt 和 C 我已经成功地实现了信号和槽来捕获标准事件 例如ButtonPushed 等等 但是 我希望当我将鼠标悬停在鼠标上并移出鼠标时调用一个函数QLabel 看起来像QHover事件 http doc qt io qt 4