2016-12-16 2 views
0

Я пытаюсь захватить события наведения для всех дочерних элементов страницы TabWidget. Я подклассифицировал QObject и повторно реализовал eventFilter(), чтобы испустить сигнал для заполнения метки. Сигнал отправляет имя целевого объекта и выбранного языка (например, «английский») в качестве аргументов. Метка имеет слот, который принимает эту информацию, и выбирает соответствующий текстовый файл для чтения и отображения информации. Он похож на отображение наконечника инструмента, но мне нужно, чтобы он отображался в ярлыке. Заголовок:Qt installEventFilter() для всех детей вкладки Page

#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()); 
    } 
    // .... 
} 
Смежные вопросы