我正在尝试捕获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 :(得分: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());
}
// ....
}