我希望能够随时按下特定的Qt :: Key,无论焦点如何。例如,ctrl + shift + F激活一个方法,使窗口重新聚焦。
我已经完成谷歌搜索如何监控输入而没有焦点在qt但我找不到任何东西。
答案 0 :(得分:4)
您可以通过继承QApplication并覆盖其event(QEvent *)
方法,或者(更常见地)通过调用qApp->installEventFilter(someObject)
来执行此操作,其中(someObject)是某个Qt对象(对您来说最方便的一个) )你的eventFilter(QObject *, QEvent *)
方法已经覆盖了你自己的实现,它监视适当的QKeyEvent并做出适当的响应。
答案 1 :(得分:1)
此功能未在Qt中实施。您可以使用Qxt。 Qxt是Qt的扩展库,提供了一套跨平台的实用程序类,用于添加Qt中不易获得的功能。它具有全局快捷键(热键),即使应用程序被最小化或隐藏,也可以检测按键。
编译Qxt后,通过将这些应用程序添加到.pro:
链接您的应用程序CONFIG += qxt
QXT = core gui
并加入QxtGlobalShortcut
:
#include <QxtGlobalShortcut>
使用示例:
QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window);
connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility()));
shortcut->setShortcut(QKeySequence("Ctrl+Shift+F"));
答案 2 :(得分:1)
在进一步搜索后找到答案: http://qt-project.org/forums/viewthread/35192
我不知道他们指的是“全球”热键,所以我基本上是在Google搜索中进行描述。
我会详细说明,因为链接的代码不准确(不得不调整很多)。
这是我目前的代码:
#define MOD_NOREPEAT 0x4000
#define MOD_CTRL 0x0002
#define MOD_ALT 0x0001
#define MOD_SHIFT 0x0004
int main(int argc, char *argv[])
{
RegisterHotKey(NULL, 1, MOD_ALT | MOD_SHIFT | MOD_NOREPEAT, 0x46);
QApplication a(argc, argv);
Interface w;
w.show();
a.processEvents();
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
if(w.isClosing)
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_HOTKEY)
{
if(msg.wParam == 1)
qDebug() << "Hot Key activated: HOME";
}
}
return msg.wParam;
}
a.processEvents将使您的QApplication继续处理事件,而不管while循环如何。当我退出程序时它不会因为在main中运行循环而被杀死,所以现在我检查来自Interface
类的bool,它会覆盖closeEvent
这样:
void closeEvent(QCloseEvent *);
在课程档案中:
void Interface::closeEvent(QCloseEvent *)
{
isClosing = true;
}
唯一的缺点是热键的十六进制代码。如果有人有解决方案,请告诉我。 0x46是F。
答案 3 :(得分:-1)
可以检测到窗口外的按键。您只需要使用内置的 Windows 库。您可以在 this article 中阅读如何操作。不幸的是,目前在 Unix 系统上并没有那么简单。