I'm just learning Qt with C++. I have successfully implemented signals and slots to trap standard events like ButtonPushed()
, etc. However, I want to have a function called when I mouse over and mouse out of a QLabel
. It looks like QHoverEvent will do what I need, but I can't seem to find any tutorials or examples on how to implement this. Is it done the same way as signals and slots?. I tried:
connect(ui.lbl_test, SIGNAL(QHoverEvent), this, SLOT(TestFunc(QEvent::Type type, const QPoint & pos, const QPoint & oldPos)));
.. but the function didn't get called when I hovered over the label.
Here is the function, listed in the header file as a public slot:
void MyDialog::TestFunc(QEvent::Type type, const QPoint & pos, const QPoint & oldPos) {
QMessageBox::information(this, tr("Hey"), tr("Listen!"));
}
Can anyone help me figure this out or point me to a good example?
EDIT:
After reading a post below, I found no setFlag()
member to call for my label widget, but I did try:
ui.lbl_test->setMouseTracking(true);
connect(ui.lbl_test, SIGNAL(ui.lbl_test->mouseMoveEvent()), this, SLOT(TestFunc(QMouseEvent *event)));
And updated TestFunc()
accordingly. But still nothing happens when I mouse over.
After looking I am not sure QLabel
even inherits the mouseMoveEvent() even from QWidget
. If this is true, is there a widget that does, or a list of objects that inherit it somewhere?. All I can tell from the documentation on their site is how many inherited functions an object has..
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
Forces Qt to generate paint events when the mouse enters or leaves the widget. This feature is typically used when implementing custom styles; see the Styles example for details.
http://qt-project.org/doc/qt-5/qtwidgets-widgets-styles-example.html#norwegianwoodstyle-class-implementation
This
QStyle::polish()
overload is called once on every widget drawn using the style. We reimplement it to set theQt::WA_Hover
attribute onQPushButtons
andQComboBoxes
. When this attribute is set, Qt generates paint events when the mouse pointer enters or leaves the widget. This makes it possible to render push buttons and comboboxes differently when the mouse pointer is over them.
QWidget
Set the Widget Attribute for WA_Hover
// in your widget's constructor (probably)
this->setAttribute(Qt::WA_HOVER, true);
Implement 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);
}
Done
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<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:
Hover the button and see the count change. Look at the application output for more information.
https://gist.github.com/peteristhegreat/d6564cd0992351f98aa94f869be36f77
Hope that helps.
According to the document link you give you're only going to get this QHoverEvent if your widget has the Qt::WA_Hover
flag.
After constructing the widget call:
widget->setAttribute(Qt::WA_Hover);
and see if it works.
Another way of achieving the same result is to override mouseMoveEvent()
in your widget
notice that this function too will not be normally called unless you call:
widget->setMouseTracking(true);
This is basically how QT implements the hover event internally.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With