PySide2(5.6.2)でQtDesignerが起動しない問題の対処法

以前のエントリでビルドしたPySide2ですが、実際に使用するにはいろいろと問題があります。このバージョンに残っている問題で、その後解決されているので現在のバージョンでは問題ないのですが、今回ビルドしたものにはいくつか問題があります。

  • QtDesignerが起動しない
  • pyside2-uic.exeでButtonGroupのあるUIがコンバートできない

このうち、1つ目の「QtDesignerが起動しない」問題についてこのエントリで解説します。もう一つについては次のエントリで。

QtDesignerが起動しない

まず一つ目。便利ツールを使うためにわざわざビルドまでしてインストールしたPySide2ですが、肝心のQtDesignerが起動しません。正確には、起動するけれどGUIが表示される前のところで引っかかって、プロセルだけ生きているけれど何の反応もない、という状態に陥ります。

PySide2に同梱されているQtDesignerの正体

ビルド工程をすべてテキストファイルにリダイレクトしてみたところ、12108行のログが書き出されました。

PySide2のdesigner.exeがどこから来たのか探ってみると、4601行目に次のようなログがありました。

これはどういうことかというと、designer.exeはこのビルド工程でビルドされたのではなく、ビルドの準備でダウンロード&インストールしたQt5.6.2の中にバイナリとして既にあったものを単にコピーしてきただけ、ということです。

そこでQt5.6.2のものを直接起動してみましたが、これも起動できませんでした。

何が起きているのかを確認する

この現象が発生したとき、タスクマネージャを確認するとプロセスの中にQtDesignerはいるので、プロセスが起動した後GUIを表示するまえにエラーで引っかかっている、という状況のようです。そこでWinDbgを使用して何が起きているのか確認してみます。

これを見ると、ntdll.dllでBreak instruction exceptionという例外が発生していることがわかります。Qt5.6.2をインストーラでインストールし、特に何もいじっていない状態であること、ntdll.dllはWindows側のDLLであることなどから、Qt側のバグではないかと疑われます。

この問題への対処法

対処するために、どういう問題が起きているのか、もう少し詳しく追う必要があります。ここまでの段階ではntdll.dllが例外を投げたということまでしかわかっていません。

Visual Studioを使用してデバッグをかけてみたところ、すべての例外で中断する設定にしても停止せず、GUIが表示されないまま待機になってしまいました。不可解…

そこでネットで検索してみたところ、以下を発見しました。

https://bugreports.qt.io/browse/QTBUG-53984

おお。Qt5WebEngineWidgets.dllがあるとGUIが表示されないという問題が報告されていて、5.6.3で治っていると書いてありますね…。5.6.3は5.6.2のバグフィックス版だと思われるため、これをインストールしてdesigner.exeだけもらってくるのが良さそうです。

Qt5.6.3を使う

早速Qt5.6.3を持ってきましょう。以下からqt-opensource-windows-x86-msvc2015_64-5.6.3.exeをダウンロードしてインストールしましょう。

http://download.qt.io/archive/qt/5.6/5.6.3/

欲しいのはdesigner.exeだけなのでこのバージョンのQtを使う予定がなければインストーラの設定は以下のような感じでOKです。

msvc2015 64-bitだけにチェック

完了後、インストールしたフォルダ内の5.6.3\msvc2015_64\bin内にあるdesigner.exeを起動してみましょう。

やった!めでたく起動できました。

考えてみれば当然です。Qt5WebEngineWidgets.dllがあると起動できない、という問題なのだからQt5WebEngineWidgets.dllをインストールしていなければ起動するに決まってました…。

PySide2のフォルダにコピーする

早速これをPySide2のディレクトリへコピーし、起動できないdesigner.exeに上書きします。試しにこれも起動確認をしましょう。

…。なんと、PySide2のディレクトリにコピーして起動したら起動できませんでした。

platform pluginがロードできないよ、と言ってます。これはPySide2フォルダ内のpluginsフォルダ内にあります。

platformsフォルダを1つ上の階層にコピーする

そこでPySide2\pluginsにあるplatformsというフォルダをコピーし、一つ上の階層に貼り付けます。つまりPySide2\platformsとなるようにする、ということです。

このようにした上でdesigner.exeを起動すると、ようやく無事に起動できました。

めでたし!長い道のりでしたが、これでようやくGUIを使用してリッチな環境でリッチかつニッチなツールを作る準備ができました。

Qt5WebEngineWidgets.dllを削除してしまう

別の方法として、原因になっているQt5WebEngineWidgets.dllをロードされないようにしてしまう、という対処があります。このほうが作業としては簡単です。

PySide2のフォルダにあるQt5WebEngineWidgets.dllの拡張子をリネームする(.dllb等)か、または削除してしまいましょう。