[PySide] タスクトレイアプリからショートカットでWindowを表示する

タイトルの通り。
やりたい事は、タスクトレイ常駐ツールとして動作してショートカットを押したら指定のUIを表示してくれる
ツールを作りたい…ということだったのですが、地味に苦戦したのでメモ。

まず、デフォルトのPySideだと、UIにフォーカスがない状態でのショートカット取得ができません。
(フォーカスなしでのキー取得をGlobalHotKeyと言うらしい)

なので、外部のモジュールを使用してGlobalHotKeyを取得して
ui.show() してあげればよさそうなものですが

QObject::setParent: Cannot set parent, new parent is in a different thread

怒られました。
のでなんとかやり方調べた結果が以下のコード。

タスクトレイ周りのコードは以前自分が書いた記事のを流用しました。

結論から言いますと、違うThreadでUI実行できねーよって言われたので
GlobalHotKeyの取得を別スレッドにして、押されたらSignalを送るようにしただけです。
注意点は、ホットキーで表示させたいUIの引数(parent)でselfを入れて上げる必要があります。
コレをいれないと、UIが一瞬しか表示されません。
threadのほうはselfを渡さなくても動きはしますが、一応入れておいたほうが良いです。

今回hotkeyを指定するのには pipでインストールした keyboardというモジュールを使用していますが
こいつはhotkeyの設定以外にも、キーを押すみたいな動作も作れるので
色々なところで活躍してくれそうです。

今回のようにThreadクラスを作る以外にも moveToThread()で移動するみたいな手法もみかけたのですが
何故か上手く動作しませんでした。
やり方がおかしいのか…?

そんなこんなで最近PySideと久しぶりに格闘してますが、
やっぱ楽しいですなぁ(´ω`)

コメントを残す

メールアドレスが公開されることはありません。

*