2016-12-16 11 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()); 
    } 
    // .... 
}