2016-12-16 13 views
0

TabWidget 페이지의 모든 하위 항목에 대한 호버 이벤트를 캡처하려고합니다. QObject를 하위 클래스로 만들고 eventFilter()를 다시 구현하여 레이블을 채우는 신호를 방출했습니다. 이 신호는 대상 객체의 이름과 선택한 언어 (예 : "영어")를 인수로 보냅니다. 레이블에는이 정보를 취하고 정보를 읽고 표시하기위한 적절한 텍스트 파일을 선택하는 슬롯이 있습니다. 그것은 도구 팁을 표시하는 것과 비슷하지만 레이블 내에 있어야합니다. 헤더 :탭 페이지의 모든 하위 항목에 대해 Qt installEventFilter()를 호출합니다.

#include <QEvent> 
#include <QObject> 

class ToolTipGenerator : public QObject 
{ 
    public: 
     ToolTipGenerator(); 
     void setLanguage(QString lang); 

    protected: 
     virtual bool eventFilter(QObject *obj, QEvent *event); 

    private: 
     QString language; 

    signals: 
     displayToolTip(const QString &lang, const QString &targetName); 
     clearToolTip(); 
}; 

출처 :

#include "ToolTipGenerator.h" 

ToolTipGenerator::ToolTipGenerator() 
{ 
    language = "English"; 
} 

void ToolTipGenerator::setLanguage(QString lang) 
{ 
    language = lang; 
} 

bool ToolTipGenerator::eventFilter(QObject *obj, QEvent *event) 
{ 
    if(event->type() == QEvent::HoverEnter) 
     emit displayToolTip(language, obj->objectName()); 
    else if(event->type() == QEvent::HoverLeave) 
     emit clearToolTip(); 

    return false; 
} 

MainWindow.cpp :

connect(generator, SIGNAL(displayToolTip(QString,QString)), 
      ui->toolTipLabel, SLOT(displayToolTipInLabel(QString,QString))); 

void MainWindow::displayToolTipInLabel(const QString &lang, 
             const QString &targetName) 
{ 
    QFile file(toolTipPath + targetName + "_" + lang + ".txt"); 
    QString line; 

    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) 
    { 
     QTextStream stream(&file); 
     while (!stream.atEnd()) 
      line.append(stream.readLine()+"\n"); 

     if(ui->tabWidgetSensor->currentIndex() == 1) 
      ui->toolTipLabelPage1->setText(line); 
    } 
    file.close(); 
} 

는 지금 탭 페이지의 모든 어린이를위한 이벤트 필터를 설치해야합니다. 이 전체 작업을 수행하는 더 좋은 방법이 있습니까? 아니면 적어도 모든 아이들을위한 이벤트 필터를 설치하는 더 좋은 방법은 그들 모두를 반복하지 않고?

답변

0

모든 이벤트를 볼 수 있도록 QApplication 개체에 이벤트 필터를 설치할 수 있습니다.

그런 다음 eventFilter에서 개체에 탭 위젯 기반이 부모 (또는 일반적으로 자녀의 자녀를두고 자하는 경우 상위 항목)인지 확인합니다.

뭔가

같은
bool ToolTipGenerator::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::HoverEnter) { 

     // compare with your target parent or loop if any ancestor should be checked 
     if (obj->parent() == youPage) 
      emit displayToolTip(language, obj->objectName()); 
    } 
    // .... 
}