QxtGlobalShortcut вызывает SIGSEGV в консольном приложении - PullRequest
0 голосов
/ 23 июля 2011

Я пишу консольное приложение, которое позволяет вам использовать 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;, если я потрошу всю функцию, кроме этой, она все равно выдаст ошибку seg.

И отладчик говорит:

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, но пока я просто бьюсь об стену. Если бы кто-то мог указать мне правильное направление или даже порекомендовать какую-нибудь другую библиотеку, которая могла бы мне помочь, или учебник по горячим клавишам, который был бы потрясающим.

Заранее спасибо!

1 Ответ

2 голосов
/ 23 июля 2011

Ваш shortcut объект построен в стеке. Он будет удален, как только вы выйдете из этой функции, поэтому ваш код обязательно потерпит неудачу, даже если он не умер в этой функции.

Вы должны создать этот объект с помощью:

 QxtGlobalShortcut *shortcut = new QxtGlobalShortcut;

Если вас не интересует утечка, сохраните этот указатель как член вашего класса и delete в его деструкторе.

Что касается сбоя, это может произойти, если вы используете версию Qxt старше 6.0 и еще не инициализировали QxtApplication.

...