【发布时间】:2015-07-23 01:33:38
【问题描述】:
我正在尝试实现在激活全局热键时截取屏幕截图的功能。我将this 应用到我的项目中,这样我就可以轻松地创建一个全局热键。
要使用 screen->grabWindow(),我必须获取活动窗口的 WinID。于是我找到了QApplication::activeWindow()->winId(),然后用了。
QScreen *screen = QGuiApplication::primaryScreen();
QPixmap screenShot = screen->grabWindow(QApplication::activeWindow()->winId(), 0, 0, -1,-1);
然而,事情正朝着错误的方向发展。当我在其他窗口中按下热键时,程序只是崩溃并显示“untitled2.exe 已停止工作”。(抱歉无法放置图像[http://ww2.sinaimg.cn/large/bcbe8e8cgw1euarn4mcb6j20vt09ojtk.jpg])
而且我发现即使我只是简单地 qDebug() 它也会发生同样的情况。不仅是winId(),还有windowTitle()、setWindowTitle()等。
qDebug() << QApplication::activeWindow()->winId();
谁能帮我解决?非常感谢!
【问题讨论】:
-
崩溃究竟发生在哪里?尝试附加一个调试器并告诉我们说的是什么。
-
@LukasBoersma 调试器说“劣质停止,因为它收到了来自操作系统的信号。信号SIGSEGV名称:信号分段含义错误:”
-
这基本上只是说发生了崩溃。您使用的是哪个调试器?您能否在您的源代码或 Qt 源代码中获得发生崩溃的确切位置?
-
@LukasBoersma 我认为这是我使用“QApplication::activeWindow()->winId()”的地方。因为每当我使用它时,它都会崩溃。
-
您的调试器应该能够告诉您崩溃发生在 Qt 源的确切位置以及窗口小部件的内部状态是什么。如果没有这些信息,将很难为您提供帮助,因为调用 winId() 是完全有效的,不会导致崩溃。如果您还没有这样做,请尝试安装 QtCreator 并使用它调试您的程序。在没有任何进一步信息的情况下,我唯一能猜到的是 QApplication::activeWindow() 可能为空。