Qt installEventFilter () для всех дочерних элементов вкладки

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

#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());
}
// ....
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]