【问题标题】:QT 5.5 Program crashes when using QApplication::activeWindow->winId() in other window在其他窗口中使用 QApplication::activeWindow->winId() 时 QT 5.5 程序崩溃
【发布时间】: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() 可能为空。

标签: c++ qt


【解决方案1】:

它崩溃是因为QApplication::activeWindow() 返回 null。如果没有应用程序窗口具有焦点,它将这样做(这是文档中的逐字记录)。没有具有焦点的应用程序窗口意味着您的应用程序窗口都没有焦点。

因此,这种方法根本不适用于您尝试做的事情。您需要使用特定于平台的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多