【问题标题】:Weird Qt behavior crashing my application奇怪的 Qt 行为使我的应用程序崩溃
【发布时间】:2014-05-29 19:16:20
【问题描述】:

通常当我在 Qt 中遇到问题时,通常是由于我不了解某些东西,但这个问题只是不合逻辑的。

我有这个处理热键事件的函数:

bool MainWidget::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    if (msg->message == WM_HOTKEY)
    {
        qDebug() << "It works";   // IF I REMOVE THIS LINE, THE APP CRASHES.
        togglevisibility(false);
    }
}

它运行得很好,但是如果我删除 qDebug() 行,那么应用程序一开始运行就会崩溃。什么都没有显示。构造函数中的代码运行,但似乎一到达该函数就崩溃了。

在我的主小部件的构造函数中,我有这行来注册我的热键:

if (!RegisterHotKey(HWND(this->winId()), 1, MOD_CONTROL | MOD_SHIFT | 0x4000, 0x41)) qDebug() << ("Hotkey failed");

添加任何其他行而不是 qDebug 并没有什么不同。 (例如删除味精)。删除 'togglevisility' 行并没有什么不同,排除了该功能。

如果我在 if 语句之前移动 qDebug 行,不会使应用程序崩溃。似乎需要 qDebug 行,这根本没有任何意义。

如果有人能理解这一点,请告诉我。我宁愿不在我的应用程序中留下 qDebug 行。

【问题讨论】:

  • 如果在函数末尾添加return false;会怎样?
  • 添加 return false、return true 或 return null 可以有效地阻止应用程序崩溃。正如下面另一条评论所指出的,应避免返回 NULL。

标签: qt crash


【解决方案1】:

我发现了如何阻止应用程序崩溃并删除 qDebug。 Qt nativeEvent 事件必须返回一个布尔值。添加行 return NULL 将停止崩溃。

但是我无法解释为什么 qDebug 之前阻止它崩溃。

【讨论】:

  • 我建议使用'false'而不是NULL(并避免使用NULL),并在使用前检查传入的指针是否有效。
  • 您是否尝试过清理项目并重建?
  • 我将 NULL 替换为 TRUE/FALSE,具体取决于函数是否接收到匹配事件,但在我的情况下没有使用返回。
  • 清理项目和重建没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多