문제

나는 그냥 학습 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

  1. WA_HOVER의 위젯 속성을 설정하십시오

    // in your widget's constructor (probably)
    this->setAttribute(Qt::WA_HOVER, true);
    
  2. 구현하다 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);
    }
    
  3. 완료

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);

무엇이 남아있는 구현 onHoverInonHoverOutMainWindow.그들은 모두 공유하는 동일한 아이디어 그래서 내가 표시 됩니다 그냥 onHoverIn

void MainWindow::onHoverIn(QObject *object)
{
    QString objectName = object->objectName();

    switch(objectName){
        // do something depending on name of the widget
    }
}

을 확장할 수 있습니다 이렇게 쉽게,프로세스를 가져 이벤트에는 새로운 항목을 설정신에 그것의 당신이 원하는 무엇을 할 onHoverInonHoverOut 방법이 있습니다.필요 서브 클래스 모니다.

QHoverEvent 호버 위젯만을위한 것입니다. enterEvent 그리고 leaveEvent 대신 위젯을 서브 클래싱하여 핸들러. 대신 이벤트 필터를 사용하려면 해당 이벤트 유형이 QEvent::Enter 그리고 QEvent::Leave.

위젯의 모양을 단순히 변경 해야하는 경우 QT 스타일 시트를 조사 할 수 있습니다. :hover 선택자.

서브 클래스 또는 필터가 필요합니다 FocusInvent 그리고 FocusOutevent 그 특정 위젯의.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top