gpt4 book ai didi

c++ - Qt installEventFilter() 用于标签页的所有 child

转载 作者:行者123 更新时间:2023-12-01 14:50:40 25 4
gpt4 key购买 nike

我正在尝试为 TabWidget 页面的所有子项捕获悬停事件。我将 QObject 子类化并重新实现了 eventFilter() 以发出信号来填充标签。该信号将目标对象的名称和所选语言(例如“英语”)作为参数发送。标签有一个插槽,用于获取此信息并选择合适的文本文件来读取和显示信息。它类似于显示工具提示,但我需要在标签内显示它。 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;
}

主窗口.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();
}

我现在必须为标签页的每个子页面安​​装事件过滤器。有没有更好的方法来完成这整件事?或者至少是一种更好的方法来为所有子项安装事件过滤器而不用遍历所有子项?

最佳答案

您可以在 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());
}
// ....
}

关于c++ - Qt installEventFilter() 用于标签页的所有 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com