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();
}
私は今、タブページのすべての子どものためのイベントフィルタをインストールする必要があります。 この全体を行うにはより良い方法がありますか?または、少なくともすべての子供のためのイベントフィルタをインストールするための良い方法は、それらのすべてをループせずに?