0

ECMAScript を使用してマウスを動かしたり、ホット キーなどを定義したりできるコンソール アプリケーションを作成しています。ハンドラー関数。

問題は、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 を使用したいと思っていますが、これまでのところ、壁にぶつかっているだけです。誰かが私を正しい方向に向けることができれば、または私を助けることができる他のライブラリ、または素晴らしいホットキーのチュートリアルを推奨することさえできます.

前もって感謝します!

4

1 に答える 1

2

オブジェクトshortcutはスタック上に構築されます。その関数を離れるとすぐに削除されるため、その関数で死ななくてもコードは失敗します。

そのオブジェクトを次のように作成する必要があります。

 QxtGlobalShortcut *shortcut = new QxtGlobalShortcut;

それを漏らさないように気になる場合は、そのポインターをクラスのメンバーとして保存し、deleteそれをデストラクタに保存します。

クラッシュに関しては、6.0 より古いバージョンの Qxt を使用していて、QxtApplicationまだ初期化していない場合に発生する可能性があります。

于 2011-07-23T18:26:42.423 に答える