今日のPHPでGUIアプリケーションを開発するというトピックは、おそらく誰も驚かないでしょう。 これには複数の解決策があります;開発中のプロジェクトと死んだプロジェクトの両方があります。 しかし、この投稿はそれらについてではなく、他のものについてではなく、PHPの新しい拡張機能であるPHPQt5ライブラリについて、またはPQEngineについてのより高度な生まれ変わりについてです 。
PS PHPQt5は、より有名なphp-qtライブラリとは何の関係もありません!
まえがき
実際、 PQEngineはSAPIモジュールですが、Zend APIを使用してphpスクリプトを実行するためのインターフェースを実装し、Qtフレームワークの一部へのアクセスを提供するエンジンとして位置付けられています。
これまでのところ、残念ながら、ごく一部にすぎません。 主なものは次のとおりです。Qtの視覚コンポーネント( ウィジェット )、レイアウト( レイアウト )、信号->スロット( 接続() )接続システム、イベント管理( QEvents )、およびQThreadクラスによって提供されるマルチスレッド。
プロジェクト作成
プロジェクトの作成とアセンブリを簡素化するために、非常に使いやすいユーティリティ-PQBuilderがあります。 このアプリケーションは99%PHPで記述されており、PQEngineエンジンの適度な機能を示しています。
このユーティリティは、PHPQt5ライブラリの公式Webサイト( http://phpqt.ru/download/pqbuilder)からダウンロードできます。
プロジェクトビルダーインターフェイス:
私たちに必要なのは、プロジェクトの名前、場所、テンプレートを示すことだけです。 選択したテンプレートに応じて、コレクターはベースコードでphpファイルを作成します。これは、将来のアプリケーションを起動するのに十分なもので、プロジェクトフォルダーでExplorer Explorerを開きます。2つのファイルと1つのフォルダーのみが表示されます:
- main.php-アプリケーションのソースコードを含むメインプロジェクトファイル。
- %projectname%.pqb - PQBuilderプロジェクトファイル。作成されたプロジェクトに関する情報を保存します。
- build-プロジェクトのビルドディレクトリ。
QWidgetアプリケーションテンプレートで作成されたプロジェクト
スクリーンショットに表示されているコードはテンプレートからコピーされたもので、実行すると空のフォームが表示されます。
注1
実際、フォームを実行するためにQWidgetから継承する必要はありません。提案されたコードは単なる例です。 ここで必要なコードはqApp :: exec()のみです。 ここで、 qAppはQApplicationクラスのインスタンスへの参照であり、 exec()関数はメインのQtイベントループへの移行を提供します。これにより、 exit()またはquit()関数が呼び出されるまで、または表示されているすべての申請書は閉じられません。
Qtフォームを表示する最も基本的な方法は、次のようなものです。
Qtフォームを表示する最も基本的な方法は、次のようなものです。
<?php $widget = new QWidget; $widget->show(); qApp::exec();
アセンブラーがプロジェクトディレクトリに移動したという事実に加えて、彼はアセンブリタブをアクティブにしました。このタブでは、将来のアプリケーションとアセンブリテンプレートのアイコンのみを選択できます。
注2
この記事の執筆時点では、3つのプロジェクトビルドテンプレートがありました。 それぞれについて簡単に:
- シンプル (アプリ)
-暗号化とパッケージングを使用しない、単純なアプリケーションのアセンブリ。 プロジェクトのメインPHPファイルはアプリケーションの作業ディレクトリにコピーされますが、PHPファイルのソースコードは開いたままです。
- シンプル+マニフェスト (アプリマニフェスト)
-マニフェストファイルを添付したシンプルなアプリケーションを作成します。 マニフェストファイル、その必要性、およびフォーマット方法については、Microsoft Webサイトで読むことができます。
- パック済み (packedapp)
-アプリケーションを構築する最も興味深い方法。メインのPHPファイルが暗号化され、コンパイルによってアプリケーションリソースにパッケージ化されます。 これにより、プログラムのソースコードが保護されます。 このテンプレートの大きなマイナス点は、main.phpファイルのみをパックできることです。他のリソース(画像、テキストなど)はプロジェクトフォルダーに残ります。
私のプロジェクトでは、 Simpleテンプレートを選択しました。プロジェクトをデバッグするたびにアプリケーションをリビルドする必要がないという点で、開発段階では非常に便利です。
プロジェクトビルドボタンをクリックすると、PQBuilderはコンパイラーを起動します。これは10〜30秒続きます。その後、アセンブルされたプロジェクトのディレクトリが開き、コンパイルプロセスが成功した場合、焼きたての実行可能ファイルが表示されます。
注3
exeファイルが表示されない場合は、コンパイル中にエラーが発生したことを意味します。 コレクターはコンパイルエラーに関する情報を提供しませんが、1レベル上のディレクトリmake.logにあるログファイルで利用できます。 通常、エラーメッセージはファイルの最後にあります。 おそらく、このログを調べると、エラーを特定して排除するのに役立ちます。
アプリケーションのリリースには、exeファイル、pqengine.dll、php5ts.dll、main.phpの4つのファイルのみが必要です。 プロジェクトディレクトリ内の残りのファイルは、コンパイラによって作成された一時ファイルであり、安全に削除できます。
アプリケーション開発
注4
PQEngineエンジンに登録されているすべてのクラスが標準のQtクラスのインターフェースを実装しているという事実により、理論的には、エンジンは公式のQtドキュメントからいくつかの例を飲み込み 、変数タイプを削除して$記号に署名するだけです。 それにもかかわらず、一部の機能は使用できないままであるか、入力値と出力値のセットとタイプが異なります。
PQEngineヘッダーファイルでこのクラスまたはそのクラスのメソッドの完全なリストを表示できます。これらのメソッドは、コレクターがインストールされているディレクトリにあります。
%install_path%\ PQBuilder \ pqenginedll \ pqclasses
Q_INVOKABLEマクロで始まるすべてのメソッドは 、PHPコードから呼び出すことができ、公式のQtドキュメントに書かれているとおりに実行されます。
PQEngineヘッダーファイルでこのクラスまたはそのクラスのメソッドの完全なリストを表示できます。これらのメソッドは、コレクターがインストールされているディレクトリにあります。
%install_path%\ PQBuilder \ pqenginedll \ pqclasses
Q_INVOKABLEマクロで始まるすべてのメソッドは 、PHPコードから呼び出すことができ、公式のQtドキュメントに書かれているとおりに実行されます。
提案されたテンプレートコードを使用して、アセンブルされたプロジェクトのあるディレクトリで直接、アプリケーションの開発を続行します。 お気に入りのエディターでbuild \ app \ release \ main.phpファイルを開き 、 initComponents()関数本体に移動して続行します。
- まず、フォームのリンカーを作成してインストールします。
注5PQEngineは3種類のレイアウトを提供します。
- QVBoxLayout-ウィジェットの垂直レイアウト。
- QHBoxLayout-ウィジェットの水平レイアウト。
- QGridLayout-グリッド内のウィジェットの場所。
private function initComponents() { $layout = new QGridLayout; $this->setLayout($layout); }
- 次に、いくつかのボタンを追加します。
private function initComponents() { $layout = new QGridLayout; $this->setLayout($layout); $button1 = new QPushButton($this); // $this - . /* . text, * setText(); * . 4 */ $button1->text = ' '; /* . * 2 : * (QEvent) */ $button1->onClicked = function($sender, $action) { QMessageBox::information($this, ' ', ', !'); }; $button2 = new QPushButton($this); $button2->text = ' PQEngine'; $button2->onClicked = function($sender, $action) { aboutPQ(); // PQEngine }; $button3 = new QPushButton($this); $button3->text = ''; /* connect(). * : * . php * PHPQt5: * http://phpqt.ru/documentation/functions/connect */ $button3->connect(SIGNAL('clicked(bool)'), $this, SLOT('quitButtonClicked(bool)')); } // - public function quitButtonClicked($sender, $checked) { $this->close(); }
- 最後に、作成したリンカーにこれらのボタンをすべて追加します。
/* ... */ $button3->connect(SIGNAL('clicked(bool)'), $this, SLOT('quitButtonClicked(bool)')); /* addWidget 3 5 : * addWidget($widget, $row, $column, $rowSpan = 1, $columnSpan = 1), : * $widget - ; * $row - ; * $column - ; * $rowSpan - , ; * $columnSpan - , ; */ $layout->addWidget($button1, 0, 0); $layout->addWidget($button2, 0, 1); $layout->addWidget($button3, 1, 0, 1, 2); /* * , - */ $layout->addWidget(new QWidget, 2, 0);
結果を確認するために、プロジェクトを再度再構築することは完全にオプションです。
ソースコードを保存し、以前にコンパイルされた実行可能exeファイルを実行するだけです。
注意してください!
この例で選択したテンプレート( Simple )を使用すると、この方法で作業できます。実際、アプリケーションのアセンブリは、[ プロジェクトアセンブリ ]タブでユーザーが選択したアイコンをアプリケーションにアタッチする場合にのみ必要です。
しかし! 注意してください! 組み立てられたプロジェクトのディレクトリですべての変更を行ったことを忘れないでください。したがって、このプロジェクトを再びPQBuilderで収集すると、すべてのコードが上書きされます。
しかし! 注意してください! 組み立てられたプロジェクトのディレクトリですべての変更を行ったことを忘れないでください。したがって、このプロジェクトを再びPQBuilderで収集すると、すべてのコードが上書きされます。
PS
「 Packed 」テンプレートを使用してアプリケーションをビルドした場合、このような焦点はなくなります。ソースコードが実行可能ファイルのリソースに添付されるため、ソースコードを変更するたびにプロジェクトを再構築する必要があるためです。
そして、これはどうあるべきかです:
プロジェクトアーカイブ (untitled.pqbファイルを解凍して開きます)