当前位置:  开发笔记 > 编程语言 > 正文

如何在Qt中实现QHoverEvent?

如何解决《如何在Qt中实现QHoverEvent?》经验,为你挑选了3个好方法。

我只是用C++学习Qt.我已经成功地实现了信号和插槽以捕获标准事件,例如ButtonPushed(),等等.但是,我希望在鼠标悬停和鼠标移出时调用一个函数QLabel.看起来QHoverEvent会做我需要的,但我似乎找不到任何有关如何实现它的教程或示例.它是否与信号和插槽完全相同?我试过了:

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!"));
}

任何人都可以帮我解决这个问题或者给我一个很好的例子吗?

编辑:

阅读下面的帖子后,我发现没有setFlag()会员要求我的标签小部件,但我确实尝试过:

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

并相应更新TestFunc().但是当我鼠标移动时仍然没有任何反应.

看完后我QLabel甚至不确定是否继承了mouseMoveEvent()QWidget.如果这是真的,是否有一个小部件,或者在某个地方继承它的对象列表?我从他们网站上的文档中可以看出,对象具有多少继承的函数.



1> shoosh..:

根据你提供的文档链接,如果你的小部件有Qt::WA_Hover标志,你只会得到这个QHoverEvent .

构建小部件调用后:

widget->setAttribute(Qt::WA_Hover);

看看它是否有效

实现相同结果的另一种方法是mouseMoveEvent()在窗口小部件中覆盖
通知,除非您调用以下内容,否则通常不会调用此函数:

widget->setMouseTracking(true);

这基本上是QT如何在内部实现悬停事件.


hm看起来你想说widget-> setAttribute(Qt :: WA_Hover);

2> phyatt..:

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/qt.html#widget-attributes

Qt的:: WA_Hover

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

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

QStyle::polish()在使用样式绘制的每个小部件上调用此重载一次.我们重新实现它以设置Qt::WA_Hover属性QPushButtonsQComboBoxes.设置此属性后,Qt会在鼠标指针进入或离开窗口小部件时生成绘制事件.这使得当鼠标指针悬停在按钮和组合框上时,可以以不同方式呈现按钮和组合框.

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

    设置WA_Hover的Widget属性

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

    实施QWidget::enterEvent()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);
    }
    

    完成

QWidget中的QHoverEvent

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/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(e));
        return true;
        break;
    case QEvent::HoverLeave:
        hoverLeave(static_cast(e));
        return true;
        break;
    case QEvent::HoverMove:
        hoverMove(static_cast(e));
        return true;
        break;
    default:
        break;
    }
    return QWidget::event(e);
}

更新:

简单的例子

将鼠标悬停在按钮上,查看计数更改.查看应用程序输出以获取更多信息.

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

希望有所帮助.



3> Michael Bish..:

为此目的使用信号和插槽不起作用.

mouseMoveEvent() 不是信号或元方法,不能连接到插槽.

对窗口小部件类进行子类化并覆盖mouseMoveEvent()将允许您获取鼠标移动事件,但这是实现此目的的一种非常重要的方法(并为您的源代码添加一个类).

相反,请考虑eventFilter()在您的MyDialog类上实现一个方法并将其安装在该类上QLabel.使用此事件过滤器方法,您可以拦截给定QObject实例的所有事件.

以下是有关事件过滤器的文档.

http://doc.qt.io/qt-4.8/eventsandfilters.html#event-filters

此外,通过查看代码示例,我建议您花一点时间来研究SIGNAL()SLOT()宏的作用.您可以看到它们的定义方式$QTDIR/src/corelib/kernel/qobjectdefs.h

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有