gpt4 book ai didi

qt - 如何使 QWidget 对事件半透明?

转载 作者:行者123 更新时间:2023-12-04 18:43:28 24 4
gpt4 key购买 nike

我见过类似的问题,但没有符合我需要的答案。我想要一个隐藏在我整个应用程序之上的小部件(这里没有问题)。我希望这个小部件能够捕捉事件,以便我可以打印关于它们的内容,记录它们,等等。我目前连接了一个事件过滤器,可以很好地做到这一点。然后我希望它让事件通过小部件后面的任何东西。因此,例如,如果我尝试按下一个按钮,则不可见的小部件应该注意到在那个位置发生了按下,然后按钮实际上应该被按下。这可以通过简单的方式完成,还是我将不得不编写代码来模拟隐形小部件下的所有事件?

最佳答案

从您在评论中披露的所有信息来看,我建议您按照之前讨论的方式过滤事件,然后使用 QCoreApplication::sendEvent将所需的事件转发到不可见的小部件。然后它会相应地将事件传播给它的 child 。

编辑:好的,这是一个包含基于 QObject 的事件过滤器的快速示例,它将过滤小部件的事件,如果事件是鼠标事件,它将留给小部件处理和打印输出,如果事件是一个关键事件,它将被过滤而不是转发回小部件:

事件过滤器类:

    class EventInfo : public QObject {
Q_OBJECT
public:
explicit EventInfo(QObject *parent = 0) : QObject(parent) {}

bool eventFilter(QObject *, QEvent *e) {
if (e->type() == QEvent::MouseButtonRelease){
qDebug() << "click event not filtered";
return false;
}
if (e->type() == QEvent::KeyRelease) {
QKeyEvent *event = static_cast<QKeyEvent *>(e);
if (event) qDebug() << "key" << event->key() << "filtered";
return true;
}
return false;
}
};

小部件:
class Widget : public QWidget {
Q_OBJECT

public:
Widget(QWidget *parent = 0) : QWidget(parent) {}

protected:
void mouseReleaseEvent(QMouseEvent *e) {
qDebug() << "widget clicked at position" << e->pos();
}

void keyReleaseEvent(QKeyEvent *e) {
qDebug() << "pressed key" << e->key();
}
};

主.cpp:
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
Widget w;
EventInfo info;
w.installEventFilter(&info);
w.show();
return a.exec();
}

测试输出以显示键盘事件被过滤并且鼠标按下事件被转发到小部件:
click event not filtered
widget clicked at position QPoint(352,230)

key 70 filtered

click event not filtered
widget clicked at position QPoint(405,163)

key 87 filtered

关于qt - 如何使 QWidget 对事件半透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16069936/

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