를 구현하는 방법을 QHoverEvent 에서는 Qt?
문제
나는 그냥 학습 Qt C++.나는 성공적으로 구현한 신호 및 슬롯 트랩 표준 이벤트 ButtonPushed()
, 니다,등등.그러나 내가 원하는 기능을 가지라고 할 때 나는 쥐고 마우스의 QLabel
.보 QHoverEvent 무엇을 할 것인가 필요하지만,나는 찾을 수 없는 것 어떤 자 또는 예제에서 구현하는 방법이다.그것은 진행하는 동일한 방법으로 신호 및 슬롯?.I tried:
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
.이것이 진실한 경우,거기서는 위젯가 또는 목록의 개체를 상속하는 그것이 어딘가?.내가 말할 수 있는 설명서에서 자신의 사이트에서는 얼마나 많은 상속된 기능 개체..
해결책
이 목적으로 신호와 슬롯을 사용하는 것은 작동하지 않습니다.
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
다른 팁
문서 링크에 따르면 위젯이 Qt::WA_Hover
깃발.
위젯 호출을 구성한 후 :
widget->setAttribute(Qt::WA_Hover);
그리고 그것이 작동하는지 확인하십시오.
동일한 결과를 달성하는 또 다른 방법은 mouseMoveEvent()
위젯에서
이 기능도 전화하지 않으면 일반적으로 호출되지 않습니다.
widget->setMouseTracking(true);
이것은 기본적으로 QT가 내부적으로 호버 이벤트를 구현하는 방법입니다.
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가 페인트 이벤트를 생성하도록합니다. 이 기능은 일반적으로 사용자 정의 스타일을 구현할 때 사용됩니다. 자세한 내용은 Styles 예제를 참조하십시오.
http://qt-project.org/doc/qt-5/qtwidgets-widgets-styles-example.html#norwegianwoodstyle 클래스-이식
이것
QStyle::polish()
오버로드는 스타일을 사용하여 그려진 모든 위젯에서 한 번 호출됩니다. 우리는 그것을 설정하기 위해 그것을 다시 시식합니다Qt::WA_Hover
속성을 켜십시오QPushButtons
그리고QComboBoxes
. 이 속성이 설정되면 QT는 마우스 포인터가 위젯에 들어가거나 떠날 때 페인트 이벤트를 생성합니다. 이렇게하면 마우스 포인터가 끝날 때 푸시 버튼과 콤보 박스를 다르게 렌더링 할 수 있습니다.
a QWidget
WA_HOVER의 위젯 속성을 설정하십시오
// 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<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);
}
업데이트:
간단한 예
버튼을 가져 가서 카운트 변경을 확인하십시오. 자세한 내용은 응용 프로그램 출력을 참조하십시오.
https://gist.github.com/peteristhegreat/d6564cd0992351f98aa94f869be36f77
도움이되기를 바랍니다.
가의 문제,나는 다음과 같은 솔루션 디자인:
에서 나의 주요한 위젯,고 싶 프로세스 가리키는 이벤트의 몇몇 선택된 객체입니다.이러한 이유로 만든 2 개의 슬롯에 나 MainWindow
:
public slots:
void onHoverIn(QObject* object);
void onHoverOut(QObject* object);
그때 생성 이벤트 필터 클래스는 다음과 같다:
hovereventfilter.h
#ifndef HOVEREVENTFILTER_H
#define HOVEREVENTFILTER_H
#include <QObject>
#include <QEvent>
class HoverEventFilter : public QObject
{
Q_OBJECT
public:
explicit HoverEventFilter(QObject *parent = 0);
signals:
void HoverIn(QObject *);
void HoverOut(QObject *);
public slots:
protected:
bool eventFilter(QObject *watched, QEvent *event);
};
#endif // HOVEREVENTFILTER_H
hovereventfilter.cpp
#include "hovereventfilter.h"
HoverEventFilter::HoverEventFilter(QObject *parent) : QObject(parent)
{
}
bool HoverEventFilter::eventFilter(QObject *watched, QEvent *event)
{
QEvent::Type t = event->type();
switch(t){
case QEvent::Enter:
emit HoverIn(watched);
break;
case QEvent::Leave:
emit HoverOut(watched);
break;
default:
return false;
}
return true;
}
당신이 볼 수있는 이 클래스는 것이 불거나 HoverIn 또는 HoverOut 에 따라서는 무슨 일이 일어났습니다. 이 접근 방식이 필요하지 않습의 설정 Qt::WA_Hover
이제 마지막 단계에서,우리는 필요하도록 지시하는 요소가 될 필터와 연결 신호 및 슬롯이 있습니다.내가 만드는 개인의 포인터 이벤트 필터에서 mainwindow.h
class MainWindow : public QWidget
{
Q_OBJECT
...
public slots:
void onHoverIn(QObject* object);
void onHoverOut(QObject* object);
private:
HoverEventFilter* hoverEventFilter;
...
};
과에서 생성자를 추가 이:
this->hoverEventFilter = new HoverEventFilter(this);
connect(this->hoverEventFilter, SIGNAL(HoverIn(QObject*)), this, SLOT(onHoverIn(QObject*)));
connect(this->hoverEventFilter, SIGNAL(HoverOut(QObject*)), this, SLOT(onHoverOut(QObject*)));
지금 할 때마다 나는 받을 가져 이벤트에 일부 개체를 그냥 이벤트 필터 설정에 그것은,다음과 같다:
this->ui->someLabelOrWhatever->installEventFilter(this->hoverEventFilter);
무엇이 남아있는 구현 onHoverIn
고 onHoverOut
에 MainWindow
.그들은 모두 공유하는 동일한 아이디어 그래서 내가 표시 됩니다 그냥 onHoverIn
void MainWindow::onHoverIn(QObject *object)
{
QString objectName = object->objectName();
switch(objectName){
// do something depending on name of the widget
}
}
을 확장할 수 있습니다 이렇게 쉽게,프로세스를 가져 이벤트에는 새로운 항목을 설정신에 그것의 당신이 원하는 무엇을 할 onHoverIn
고 onHoverOut
방법이 있습니다.필요 서브 클래스 모니다.
QHoverEvent
호버 위젯만을위한 것입니다. enterEvent
그리고 leaveEvent
대신 위젯을 서브 클래싱하여 핸들러. 대신 이벤트 필터를 사용하려면 해당 이벤트 유형이 QEvent::Enter
그리고 QEvent::Leave
.
위젯의 모양을 단순히 변경 해야하는 경우 QT 스타일 시트를 조사 할 수 있습니다. :hover
선택자.
서브 클래스 또는 필터가 필요합니다 FocusInvent 그리고 FocusOutevent 그 특정 위젯의.