【问题标题】:QxtGlobalShortcut causes SIGSEGV in console applicationQxtGlobalShortcut 在控制台应用程序中导致 SIGSEGV
【发布时间】:2011-07-23 17:34:13
【问题描述】:

我正在编写一个控制台应用程序,它允许您使用 ECMAScript 来移动鼠标,并定义热键等。鼠标的东西可以工作,现在我正在尝试添加定义热键的功能,按下时会调用 QtScript 处理函数。

问题是,当我尝试使用 QxtGlobalShortcut 创建热键时,我得到一个 SIGSEGV 并且一切都崩溃了。

代码如下:

int Keyboard::hot_key(QString key) {
    QxtGlobalShortcut shortcut;
    shortcut.setShortcut(QKeySequence(key));
    shortcut.setEnabled(true);
    connect(&shortcut, SIGNAL(activated()), this, SLOT(hot_key_pressed()));
    return 0;
}

这一行QxtGlobalShortcut shortcut;,如果我把除那一行之外的整个函数都删掉,它仍然会抛出一个段错误。

调试器说:

1   ZNK17QxtGlobalShortcut8shortcutEv   C:\Qxt\lib\QxtGui.dll   0   0x6f6f14a6  
2   ZN17QxtGlobalShortcutC1EP7QObject   C:\Qxt\lib\QxtGui.dll   0   0x6f6f14f7  
3   Keyboard::hot_key   keyboard.cpp    16  0x403c0c    
4   Keyboard::qt_metacall   moc_keyboard.cpp    74  0x404740    
5   QMetaObject::metacall   qmetaobject.cpp 237 0x8f5ff8

考虑到在我看来 Windows 热键并不容易,我真的很想使用 Qxt,但到目前为止我只是碰壁了。如果有人能指出我正确的方向,或者甚至推荐一些其他可能对我有帮助的库,或者一个很棒的热键教程。

提前致谢!

【问题讨论】:

    标签: c++ qt4 libqxt


    【解决方案1】:

    您的shortcut 对象是在堆栈上构造的。一旦你离开那个函数,它就会被删除,所以即使你的代码没有在那个函数中死掉,它也一定会失败。

    您应该使用以下方法创建该对象:

     QxtGlobalShortcut *shortcut = new QxtGlobalShortcut;
    

    如果您不想泄露它,请将该指针存储为您的类的成员,并将 delete 存储在它的析构函数中。

    至于崩溃,如果您使用的 Qxt 版本早于 6.0 并且尚未初始化 QxtApplication,则可能会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多