如何让QWidget对事件进行半透明?

Bri*_*ide 5 qt

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

dte*_*ech 4

根据您在评论中披露的所有信息,我建议您按照前面的讨论过滤事件,然后使用QCoreApplication::sendEvent将所需的事件转发到不可见的小部件。然后它将相应地将事件传播给其子级。

编辑:好的,这里是一个快速示例,其中包含基于 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

小部件:

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();
    }
};
Run Code Online (Sandbox Code Playgroud)

主要.cpp:

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    EventInfo info;
    w.installEventFilter(&info);
    w.show();    
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

测试输出以显示键盘事件已过滤并且鼠标按下事件已转发到小部件:

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
Run Code Online (Sandbox Code Playgroud)