Qt installEventFilter() 用于标签页的所有 children
Qt installEventFilter() for all children of a Tab Page
我正在尝试为 TabWidget 页面的所有 children 捕获悬停事件。我将 QObject 子类化并重新实现了 eventFilter() 以发出信号来填充标签。该信号发送目标名称 object 和所选语言(例如 "English")作为参数。标签有一个插槽,用于获取此信息并选择合适的文本文件来读取和显示信息。它类似于显示工具提示,但我需要在标签内显示它。
Header:
#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();
}
我现在必须为标签页的每个 child 安装事件过滤器。
有没有更好的方法来完成这整件事?或者至少是一种更好的方法来为所有 children 安装事件过滤器而不循环遍历所有这些?
您可以在 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());
}
// ....
}
我正在尝试为 TabWidget 页面的所有 children 捕获悬停事件。我将 QObject 子类化并重新实现了 eventFilter() 以发出信号来填充标签。该信号发送目标名称 object 和所选语言(例如 "English")作为参数。标签有一个插槽,用于获取此信息并选择合适的文本文件来读取和显示信息。它类似于显示工具提示,但我需要在标签内显示它。 Header:
#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();
}
我现在必须为标签页的每个 child 安装事件过滤器。 有没有更好的方法来完成这整件事?或者至少是一种更好的方法来为所有 children 安装事件过滤器而不循环遍历所有这些?
您可以在 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());
}
// ....
}