Qt 5.1およびWindowsでの適切な展開

こんにちは

彼は私にはあまり親切ではありませんでした。彼は人生の10時間を簡単な質問の解決策を探して過ごしましたが、最終的にはそれを見つけました。

だから、簡単な背景。

顧客の1人から、Qtでキオスクモードアプリケーションを開発するように依頼されました。 まず、Windows XPでPOS端末用のバージョンを作成します。

OK、1週間で、添付のレイアウトに従って何かをして、バージョンを顧客に提供しようとしました。 Qt5Core.dll、Qt5Gui.dll、およびQtが使用するその他の.dllモジュールをアタッチすることにより。

「プラットフォームプラグインのロードに失敗しました」ウィンドウ」と、 日本のフィンランドのチェーンソーは言いました。



ええ、グーグルに行きます。

まず、公式ドキュメント:

qt-project.org/doc/qt-5.0/qtdoc/deployment-windows.html

彼女はあまり助けにはならず、qt-project.orgのフォーラムを読みに行きました。 推奨されるソリューションは次のとおりです。

1)/qtbase/plugins/platforms/qwindows.dllをプラットフォームまたはプラットフォームディレクトリのアプリケーションフォルダーにコピーします

動作しませんでした

2)/qtbase/plugins/platforms/qwindows.dllをプラグイン/プラットフォーム、プラグイン/プラットフォームディレクトリのアプリケーションフォルダーにコピーします

動作しません

3)環境変数QT_QPA_PLATFORM_PLUGIN_PATHを設定し、qwindows.dllが含まれるフォルダーへのパスを指定します

獲得しました。 しかし、ユーザーのコンピューターにインストールするときに、環境変数を変更したくありません。 まず、ユーザーはそれを削除できます。また、ロード時にアプリケーションがクラッシュするため、松葉杖なしでその可用性を確認することもできません。 第二に、ユーザーはQtの異なるバージョンでアプリケーションをインストールできます-そして、こんにちは、不具合、非互換性。

4)公式文書からの決定。 main()関数でアプリケーションを初期化するときに、次の形式の行を追加します。

qApp->addLibraryPath("C:/customPath/plugins");
      
      





qAppはQApplicationです。 うまくいきませんでした。

5)コマンドライン引数 "-platformpluginpath \" path_to_folder_with_qwindows.dll \ ""を使用します

調べました。 動作します。 出来上がり! これが解決策です! (これは真実ではないことが判明しました)



次のようにinnosetupスクリプトを編集します。



 [Files] ... Source: "..\build\deploy\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\TryumPosWin.exe"; Parameters:"-platformpluginpath \"{app}\platforms\"" ; WorkingDir: "{app}";
      
      







私たちは顧客に感謝します。

早く喜ぶ、sqliteは動作しません。 プラグイン\ sqldriversを入れても、sqldriversは役に立たなかった-表示も読み込みもできません。コードは次のとおりです。

  if (QSqlDatabase::isDriverAvailable("QSQLITE")){ qDebug("QSqlite driver found."); } else { qFatal("QSqlite driver NOT found!"); }
      
      





エラーでドロップアウト。 SQLプラグインの環境変数またはコマンドライン引数が見つかりませんでした。

彼は公式文書に戻って考えた。 そして実際、なぜインスタンスから静的メソッドを呼び出すのですか?

また、静的なので、インスタンスを作成する前に呼び出すことができますか?



このコードは最終的に動作します:

 int main(int argc, char *argv[]) { Q_INIT_RESOURCE(resources); QStringList paths = QCoreApplication::libraryPaths(); paths.append("."); paths.append("imageformats"); paths.append("platforms"); paths.append("sqldrivers"); QCoreApplication::setLibraryPaths(paths); QApplication a(argc, argv); a.setQuitOnLastWindowClosed(false); QDbc::init(); MainWindow w; w.showFullScreen(); a.exec(); QDbc::finalize(); }
      
      





ところで、パスを設定する別の方法に出会いました:

 paths.append(QCoreApplication::applicationDirPath() + "/plugins");
      
      





ただし、QCoreApplication :: applicationDirPath()は、QApplicationインスタンスがまだ作成されていない場合に警告をスローするため、正常に動作しません。



実際、InnoSetupの[ファイル]セクションは次のようになります。



 [Files] Source: "..\build\deploy\icudt51.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\icuin51.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\icuuc51.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\libEGL.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\libGLESv2.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\msvcp100.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\msvcr100.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\Qt5Core.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\Qt5Gui.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\Qt5Network.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\Qt5Sql.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\Qt5Widgets.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\build\deploy\imageformats\qico.dll"; DestDir: "{app}\imageformats"; Flags: ignoreversion Source: "..\build\deploy\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion Source: "..\build\deploy\sqldrivers\qsqlite.dll"; DestDir: "{app}\sqldrivers"; Flags: ignoreversion
      
      







この記事は包括的な研究であるとは主張していませんが、適切な実用的なソリューションを見つけられなかったため、独自のソリューションを公開することにしました。

ご清聴ありがとうございました!



All Articles