Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中模拟全局按键_C++_Qt_Keypress - Fatal编程技术网

C++ 在Qt中模拟全局按键

C++ 在Qt中模拟全局按键,c++,qt,keypress,C++,Qt,Keypress,我正在为raspberry pi构建一个Qt应用程序,它连接到一个旋转编码器。当用户按下旋转编码器按钮时,应用程序注册来自该按钮的硬件中断,并发出应用程序可以截获的信号 挑战在于应用程序有多个可显示的窗口,我只想有一个功能,将按钮按下信号转换为全局按键,可由应用程序中的任何活动窗口注册,无需添加额外的逻辑来确定哪个窗口处于活动状态,即可将按键直接发送到该窗口。有没有一种方法可以模拟系统范围内的按键,这样无论哪个窗口处于焦点,都可以得到它 到目前为止,我有以下代码片段,但它需要对特定QObject

我正在为raspberry pi构建一个Qt应用程序,它连接到一个旋转编码器。当用户按下旋转编码器按钮时,应用程序注册来自该按钮的硬件中断,并发出应用程序可以截获的信号

挑战在于应用程序有多个可显示的窗口,我只想有一个功能,将按钮按下信号转换为全局按键,可由应用程序中的任何活动窗口注册,无需添加额外的逻辑来确定哪个窗口处于活动状态,即可将按键直接发送到该窗口。有没有一种方法可以模拟系统范围内的按键,这样无论哪个窗口处于焦点,都可以得到它

到目前为止,我有以下代码片段,但它需要对特定QObject的引用来引导按键:

QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter);
QCoreApplication::postEvent (receiver, event);

其中,
接收器
也是指向按键的对象。有什么想法吗?

向所有顶级小部件(即windows)播放关键事件:

要直接将事件发送到活动窗口(最前面的窗口),请执行以下操作:


QCoreApplication::postEvent()
方法只将事件发送到GUI元素,而不将其发送到操作系统或其他应用程序。我建议您使用操作系统的库来模拟全局密钥。请参阅是否可以至少触发密钥事件,以便应用程序中的所有窗体和控件都可以获取密钥(或者甚至只是活动窗体)?我试图避免向每个单独的视图控制器添加信号和插槽来处理按键。如果您希望将事件发送到具有焦点的小部件,然后使用
QApplication::focusWidget()
,我建议对您的问题进行界定,因为根据您想要的内容,您可以有不同的解决方案,我认为您有不同的解决方案
    for(auto w : qApp->allWidgets())
    {
        if(w->isTopLevel())
        {
            qApp->postEvent(w, new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier));
        }
    }
qApp->postEvent(qApp->activeWindow(), new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier));