ノキアのリリースのQt 4.5およびQt Creatorの1.0 - Qtの拡張なるプロのバッグ
ニュースは古いですが、まだ暖かいです。 最終日の火曜日3月3日、ノキアは、Qtの待望のバージョン4.5を発表したQtの拡張順序を与え、また、Qt Creatorの最初のリリースを発表した。
マウスでのEclipse、CDT、Qtは、Subversionには、Perl、WebツールVimとだけをインストールし、統合
昔のポストはない遠くここから、我々はSubversionのとQtの開発および統合するためのプラグインでEclipseをインストールする方法を示します。 しかし、時間の経過、バージョンの変更、すべてが異なっており、今回は、クリックとのEee PCでのみ実行する方法を示します。
Eclipseの+ QT + SVN
多くのチュートリアルより個人的なログのように、私は簡単にアクセス可能な場所に、私自身の使用のためのEclipseの設定手順、またはEclipseと私が通常使用するプラグイン(svnとQT)のインストールを残す必要性を感じ。
あなたの家の外にあるディレクトリに影響を与えるコマンドは、スーパーユーザー権限が必要です。
あなたのディストリビューションで利用可能なパッケージを起動し、Eclipseをインストールする場合は、#ステップ2にまっすぐ進むことができます。
#ステップ0:インストールJava
日食の仕事のために、あなたは、Java Runtime Environment(JRE)がインストールされている必要があり* E *設定されています。
JREは、日曜のサイトから直接ダウンロードすることができますhttp://java.sun.com/javase/downloads/index.jsp 。 インストールおよび構成のための完全な手順については、で発見することができますhttp://java.sun.com/javase/6/webnotes/install/index.html Java 6の場合は、。
ステップ#1:DonwloadとインストールEclipseの
:日食は簡単に同社の公式ウェブサイト上のダウンロードエリアからダウンロードすることができますhttp://www.eclipse.org/downloads 。 ダウンロードした後、それを解凍して使って終了します。 私の場合は使用しました。
-xvzf eclipse-cpp-europa-winter-linux-gtk.tar.gz -C / usr / local user @ hostの$ください。tar-xvzfのeclipse-CPP-ヨーロッパ·冬のlinux-gtk.tar.gz-C / usr / localに
すべてが実行可能な日食が/ usr / local /日食/月食になりました場合は、ちょうどあなたの好みのグラフィック環境でのリンク/ショートカット/何を作成します。
ステップ#2:QTを持つプラグインの統合をダウンロードしてインストールします
私が現在使用しているプラグインは独自のTrolltech社によって提供されています。 そこには小さなグラフィックエディタからプロジェクトファイルを管理することができ、好む場合であっても、ファイルへの直接アクセスを持っています。プロ。
からダウンロードすることができますhttp://trolltech.com/developer/downloads/qt/eclipse-integration-download 、とで見つけることができ、完全なインストール手順http://trolltech.com/developer/downloads/qt / qteclipse-installmanualは非常に複雑です。
-xvzf qt-eclipse-integration-linux.x86-gcc3.3-1.4.0.tar.gz -C / usr / local user @ hostの$ください。tar-xvzf QT-Eclipseベースの統合- linux.x86-gcc3.3とコンフリクト-1.4.0.tar.gz-C / usr / localに
すべてがうまく行ったら、プラグインファイルはディレクトリ/ usr / local /日食/プラグインにコピーされます。
注:ディストリビューションパッケージを介して、Eclipseのインストールを選んだ人のために、注目! 圧縮ファイルの内部では、ディレクトリには、Eclipse /プラグイン/、歯科彼のEclipseインストールのpluginsディレクトリにコピーする必要がありますプラグインファイルは、通常は/ usr / lib /日食/プラグインです。
インストール後、コマンドを使用してEclipseを起動します。
usr / local / eclipse / eclipse -clean user @ hostの$は/ usr / local /日食/月食クリーン
今、> [設定]> [ウィンドウに移動し、Qtのバージョンと "少ないほどパス"を設定し、Qtのインストールに応じて
あなたがコマンドラインから直接Eclipseを起動した場合、より便利にするために、(。bash_profile)に起動スクリプト内のどの$ PATH環境変数に実行可能ファイルのディレクトリを追加する
= $PATH : / usr / local / eclipse PATH = $ PATHをエクスポートします。/ usr / local /日食
ステップ#3:Subversionの
日食では>ソフトウェア更新>検索およびインストールに進みます。 インストールする新規フィーチャーをオプション検索マルケ次へ]をクリックします。 今、リモートサイトを追加します。
バックミンスター
http://download.eclipse.org/tools/buckminster/updates
Subclipseの
http://subclipse.tigris.org/update_1.2.x
それぞれのチェックボックスをマークし、[完了]をクリックします。 インターネットへの短い協議の後、単にプラグインとの依存関係をチェックし、抱擁するために実行する。
QT、第III部で開始- qmakeのとPro。
この第三のポストでは、QTユーティリティqmakeのプロジェクトファイルと*について話します。プロ。 私たちはそれがqmakeのために何であるかを理解し、さまざまな種類のプロジェクトを構成する方法をみましょう。
qmakeは
qmakeはQtフレームワークが付属していますユーティリティです。 その機能は、プロジェクトファイル(*。Pro)を解析してのルールで既にMakefileを生成することですmocは 、 UICとQT埋め込まれたオプションがあります。 それなしで、たとえば、明示的にファイルを作成し、moc_ *明示的に我々のプロジェクトへの正しいQTを含めるようにコンパイラとリンカのオプションに渡すmocを呼び出す必要があります。
qmakeのプロジェクトとファイルに関する公式ドキュメントは見つけることができますここで 。
*プロジェクトファイル。プロ
コマンドラインから簡単なプロジェクトを作成するには、プロジェクトディレクトリから次のコマンドを入力を入力します。
user @ hostの$ qmakeの-プロジェクト
行われていることは、拡張子に続いて、現在のディレクトリと同じ名前のファイルが作成されます。プロ。 qmakeによって認識され、このディレクトリ内のファイルが既に存在する場合は、ソースコードファイル(。H. CPP)、フォーム(UI)などのように、それらは自動的にプロジェクトファイルに追加されます。
ファイルを作成しました。Proは、引数なしでqmakeを実行するために、それはファイルを解析しようとします。カレントディレクトリと同じ名前のプロ。 あなたも、qmakeの引数として別のプロジェクトファイルを指定することができます。 ネットワークが動いたら、Makefileを作成され、簡単にすると、我々はプロジェクトをビルドすることができます。
プロジェクトファイルは、Makefileを作成するにはqmakeによって解釈されるマクロやディレクティブを含む通常のテキストファイルです。 オプションの完全なリストは、ドキュメントに記載されていますオンライン 。 最も一般的なのは以下のとおりです。
テンプレート:プロジェクトの種類を指定します。 proramas実行可能ファイルの 'アプリ'または 'lib'にライブラリを作成するを使用しています。
CONFIG:プロジェクトにいくつかのオプションを追加します。 中でも、 'DEBUG'デバッグ情報がabiblioteca静的(Linuxのそれ)が作成されているテンプレートの 'lib'と一緒に、 "staticlib"を追加します。
TARGET:ターゲット、すなわち、アプリケーションまたはライブラリの名前と場所。
MOC_DIR:ファイルが卒業生となるディレクトリmoc_ *。 ソースコードディレクトリを汚染しないように役立ちます。
OBJECTS_DIR:前のオプションとコンプリメンタリには、その上にファイル(*。O)オブジェクトコードを生成するディレクトリを示します。
INCLUDEPATH:ヘッダーがそのような外部ライブラリのヘッダとして、プロジェクトで使用される外部ディレクトリ。
DEPENDPATH:プロジェクトで使用される外部のソースコードディレクトリ。
HEADERS:プロジェクトのヘッダファイル(* H)。
FORMS:QTDesigner(*。UI)で生成されたインタフェースファイル。
源:プロジェクトのソースコードの実装(*。CPP)ファイルが変更されます。
LIBS:プロジェクトで使用される外部ライブラリ。 -Lはライブラリへのパスを示し、E-lはライブラリ名を言う。
QT:QTはプロジェクトから削除/追加するモジュールです。 もし過去の "QT = '(空のQTに等しい)、QTは、プロジェクトで使われたモジュールではありません。
SUBDIRS:テンプレート 'サブディレクトリ'と組み合わせて使用することで、サブディレクトリのONS qmakeが他のプロジェクトファイルを探す必要があることを示します。
手でこれで我々はいくつかのシンプルなデザインを作成することができます。
単純なアプリケーション:
#最初の行はこのコメントの文字を作成します。 #このファイルの名前は 'app.pro'です 私たちの#のTEMPLATE =アプリのテンプレートと呼ばれるアプリケーションです。 DIR /ビン内のTARGET =ビン/#myapp.bin myapp.bin MOC_DIR MOCS用= TMP / mocは#ディレクトリ、オプションの OBJECTS_DIRオブジェクトコードのために= TMP / objが#ディレクトリ、オプションの HEADERS + = MyClass.h#ヘッダのクラスMyClass SOURCES + = main.cppの#ファイルにを整理するために使用します。 myclass.cpp#複数の行。
シンプルなライブラリ:
#このファイルの名前は "lib.pro"です 私たちの#のTEMPLATE = libのテンプレートは、ライブラリです。 CONFIG + = DLL#動的呼び出し DIR / Libの中でTARGET = libを/ mylibを#MYLIB MOC_DIR MOCS用= TMP / mocは#ディレクトリ、オプションの OBJECTS_DIRオブジェクトコードのために= TMP / objが#ディレクトリ、オプションの HEADERS + = MyClass.h#ヘッダのクラスMyClass MyClassクラスのソースは、+ = myclass.cpp#実装
外部ライブラリを使用するアプリケーション:
#このファイルの名前は 'mixed.pro'#テンプレートです=アプリは、当社のテンプレートは、TARGET =ビン/#dirの中でmyapp.lkd myapp.lkd /ビンMOC_DIR MOCS用= TMP / mocは#ディレクトリ、オプションと呼ばれるアプリケーションです。 OBJECTS_DIRオブジェクトコードの#ディレクトリ= TMP / objは、オプションのインクルードパス+ =。 #ディレクトリここで外部のlibソースのヘッダは、アプリケーションの+ = main.cppの#実装です。
ネストされたディレクトリ:
ネストしたディレクトリを利用するために、我々は現在のディレクトリ内のプロジェクトファイル、および別のサブディレクトリを必要としています。
現在のディレクトリで、オプションを使用します。
TEMPLATE =サブディレクトリ SUBDIRS = [順序でビルドされるサブディレクトリの一覧]
ディレクトリ名だけを与えられた場合、それはあなた自身の名前のプロジェクトファイルを含める必要があります。 それはentandoで、サブディレクトリのリストに直接報告可能性があり、1つのディレクトリクエーカー名を持つプロジェクトファイルが続く。
このチュートリアルで説明する例の完全なソースコードを見つけることができますここで 。
結論として
qmakeはプロジェクトはQT(ちょうど '= QT "の末尾に追加)を使用していない場合でも、非常に複雑なプロジェクトのツリーを管理する必要がある一つの人生を容易にし、シンプルで非常に強力なツールです。 これにプロジェクトファイルは非常に単純でやや直感的な構文を持っているという事実を追加します。 あなたが微調整が必要な場合は、 オンラインマニュアルはあなたに楽しみのためにダースのオプションを提供します。
の有無にかかわらずQT QT qmakeは常にツリーのビルドの管理に適したオプションです。
QTで始まる、パートII -シグナル、スロットとタイマー
この記事で私はQTで初心者のための小規模なチュートリアルを作るためにゲームに続いた。 今回は、独自のシグナルとスロットを作成する方法とタイマを処理する方法を示します。
ソースコードはこれで見つけることができますリンク 。
サンプルプログラムでは、クラスを使用しますタイマーで使いQTimer 、QTの主なクラスのいずれかを、クラスでのスタイル液晶ディスプレイの電卓を使用して、時間が表示されますQLCDNumberを 。
QTとタイマ
QTの中で最も基本的なサポートタイマーのメソッドを提供QObjectのクラスから利用可能ですstartTimer :: QObjectを() と QObject :: KillTimerを() 。 最初の方法は、一意のIDを返し、秒のタイマーは、このIDを使用してタイマーを終了します。
これが機能するためには、しかし、このメカニズムを使用するコード·スニペットは、 "イベントループ"内である必要があります。 瞬間からタイマーが時々からそれを開始されます(タイムアウト)アプリケーションdispateなりfireするとイベントが処理されるまで、プログラムの正常な流れを混乱させる。
タイムアウトの最大値が定義されていない、長年のタイムアウトのタイマーを作成できますが、最小の時間はシステムごとに異なります。 Linuxの2.6.xでは、これは(デフォルトは4 msです)は設定されている間、Windows Vistaで最小のタイマーは10ミリ秒です。 要求されたQTは、すべてのイベントを提供しようとしますが、システムが許可しない場合には、 "余剰"を破棄します。
タイマーは、スレッドで使用することもできますが、イベントループの内側であることの要件を満たす必要があります。 スレッドは、いつものように、別の記事に値する...
クラスの使いQTimerのタイマーは、一部の機能を可能にする、より高いレベルを実装します。 一つは、 使いQTimer :: singleShot()は、一度イベントを発生させます。
豊富なドキュメントと退屈な、繰り返しを読みますが、私を信じて、あなたはQDorDeCabecaの多くが保存されます...
シグナルとスロットの詳細
シグナルとスロットはオブジェクト、QTの基本的な部分の一つとの間の通信に使用されています。 イベントを処理するコールバックを実装するのではなく、このシステムでは、我々は、プログラミングをより直感的な意思、スロットへの信号接続の概念を使用します。
シグナルとスロットはによって処理されるクラスのメソッドであるメタオブジェクトコンパイラ(MOC)のソースコードがコンパイルされる前に。 彼らはの一部ではありません特別なステートメントを持っている標準C + +ではfazum mocは、ソースコードを解析し、コンパイルが生成されます。
あなたはシグナルとスロットを実装する任意のクラスにmocを実行すると、ソースコードの特定の量が生成されます。 プログラムを使用してqmakeを mocは、プログラムへの呼び出しは、プログラマにそれを透明に、Makefileによって負担されている。
クラスは、シグナルとスロットを実装することができ、それはへのアクセスを必要とするメタ-オブジェクトシステム 。 だからクラスから継承する必要がありますQObjectをとそのサブクラス、およびマクロが必要にQ_OBJECTお住まいの地域のプライバシーステートメントでは。 "スロット[| |保護官民]"の準備が完了すると、信号は、セクションとスロットのセクション"シグナル"で宣言されています。
宣言された後のスロットは、任意の他の一般的なメソッドとして定義され、明示的に他のと同様に呼び出すことができます。 すでに兆候がもう少し繊細であり、しかプログラマによって定義され、宣言されています。 その理由は? 構築する試みの終了時にこのメッセージ
TMP / moc_mydisplay.o:関数 `MyDisplay :: signalPlay() 'の場合: 〜/ストップウォッチを/ tmp / moc_mydisplay.cpp:89: `:: MyDisplayのsignalPlay()の複数の定義" TMP / mydisplay.o:〜/ストップウォッチ/ mydisplay.cpp:169:最初にここで定義されている collect2:ldはステータス1で終了を返し 行います。** [ストップウォッチ]エラー1
ファイル内に次のコードをmoc_mydisplay.cpp生成されます。
/ / 0信号 signalPlay ( ) ボイドMyDisplay :: signalPlay() { activate ( this , & staticMetaObject , 0 , 0 ) ; QMetaObject ::アクティブ(これは、&staticMetaObject、0、0); }
はい、mocはQTのいわゆるメタメソッドの定義の信号を生成します。 したがって、記号のボディを定義するCTで違法であるとresetメソッドは、コンパイルエラーを生成します。 mocはあなたのための信号の実装の世話をしてみましょう。
接続する
それはちょうどセットシグナルとスロットを使用している。 あなたは彼らがどのように相互作用するかを定義する必要があります。 これを行う方法はのこの相続人全体のconnect()メソッドを介してそれらを接続することである QObjectを 。 これは、mocはシグナルを実装しますので、そのコール(s)の結果への呼び出しスロット(S)と同じパラメータを使用して、接続(S)。
接続に応じて、信号があっても戻って呼び出された最後のスロットと同じ値を返すことができます。 このため、複数のスロットに接続されている信号に対して非常に安全ではないことに注意して、何も呼び出しの順序を保証しません。
与えられた信号は、直接第二の信号に接続することができます。 ので、最初の信号にemit()を(その後放出するのと同じです)第二の信号で、MOCSを作成する工程の後、一方、最初の呼び出しの結果、他のメソッドに接続された呼び出しで結果番目の呼び出しに、と 。
接続する方法
そこにシグナルとスロットを接続するための3つの方法は、基本的には、正しく使用しないと発見することがとても困難なバグの原因となることがあります。 接続のこれらのフォームは、connect()メソッドに追加パラメータとして渡されます。 彼らは、次のとおりです。
接続を指示する :スロットは信号は、信号が発行されたスレッド内で発行された直後に呼ばれています。 これは、スロットへの直接コールとしての役割を果たします。
接続キューに入れられた :信号が送信され、スロットへの呼び出しは、QTの内部リストになり、信号が呼び出されるかが行われていないスロットに関わらず、すぐに返されます。 ループは、このリストを処理するeventeされ、それ以降でのみスロットは、オブジェクトがスロットに常駐するスレッド上で呼び出されます。
自動接続 :これは、接続のタイプを指定していないときに使用されるデフォルトのタイプです。 それの一つである"悪の種子"は、2つの異なる動作を示します:シグナルとスロットが同じスレッド上に存在する場合、直接接続として動作しますが、それ以外には、キュー内の接続で動作します。
キューに入れられた接続を遮断 :ヘイ! ちょうど3つではなかった? まあ、これはこの記事を読んで1つの利点である:あなたが矛盾してマニュアルを節約! この接続は、信号が正式に実行されるまで、シグナルスレッドがブロックされていることを除いて、キュー内の接続に似ています。 非常に慎重に使用すべきであることに注意してください、別のスレッドでシグナルとスロット。 誤用は、デッドロックを引き起こす可能性があります。 あなたはこのような何かを見たときのことがわかります。
ユーザ@ホスト:〜/ストップウォッチ$ /ストップウォッチ。 QT:BlockingQueuedConnectionを活性化している間に検出されたデッドロック:送信者は、 MyDisplay(0x8076ac0)である受信機QPushButton(0x807e2d8)
何を意味しているのかについての疑問を解決するには"オブジェクトが存在するスレッド" QT arespeitoのスレッドを参照してください。を。
常にシグナル、スロット、スレッドとタイマーと細心の注意を払う。 これらは、QTの主な特徴ですが、その誤用は見つけることが極めて困難なバグにつながる可能性があります。 それについてのすべてのドキュメントを参照してください。
ダウンソースへ
私たちの例では、2つのクラスとMyDisplayストップウォッチファイルとメイン一般的な構成です。 メインだけQApplicationオブジェクトストップウォッチを作成します。 クラスは、ボタンとLCDの表示スタイルを持つダイアログで構成されるプログラムのMyDisplay視覚的な部分の世話をする。 Stopwatchクラスは、タイマーを表示して実装するウィジェットを作成します。 このアーキテクチャはクラスストップウォッチMyDisplayから継承することがさらに興味深いことに、ほとんどのelegenteないことに注意してください。 しかし、それは実質的にシグナルとスロットを使用する必要がなくなり、ゲームを台無しにするだろう。
我々はオブジェクトが外部と通信するときにシグナルとスロットの使用が明確になります。 一般的に、クラスは外側の何か分からない。 それらの内の外部オブジェクトへのポインタを渡し、それがカプセル化が痛いとコードは以下の一般的なことができます。 この例では、シグナルとスロットを使用する方が興味深いのは、これは一般性やカプセル化で失われることなく、オブジェクト(内部ストップウォッチ)/からオブジェクトストップウオッチ(外部Mydisplay)へのレポートのイベントにmyDisplayです。
Qt Designerは(別の記事で私はそれをお話します)の助けを借りて、私は、ダイアログ、ボタンとLCDを作成しました。 した後は、我々の目的に合わせてコードを簡略化。 myDisplayはQDialogから継承され、これが間接的に十分なクラス宣言のprivateセクションにQ_OBJECTマクロを追加することでしたシグナルとスロットを使用するには、QObjectから継承する方法。 その後、他の補助の間で追加された方法:
公共スロット: long ) ; slotDisplayValueボイド(長い)。 プライベートスロット: slotPlayボイド(); slotStopボイド(); 信号: signalPlayボイド(); signalPauseボイド(); signalStopボイド(); signalResetボイド();
兆候は、ボタンのクリックに関連する外部のイベントに通信します。 公衆は、外部からのタイマ刻みの権利されている間、既に民間のスロットは、前処理の手順を行います。 したがって、このクラスは、外部に情報を送信し、他の側に何を知らなくても、外部から情報を受け取ります。 古き良きインターフェース契約を締結しました。
公共スロット: slotPlayボイド(); slotPauseボイド(); slotStopボイド(); slotResetボイド(); プライベートスロット: slotTickボイド(); 信号: long ) ; signalTicksボイド(長い)。
逆に、アナログとStopwatchクラスは、信号MyDisplayクラスを受けるスロットを実装し、そのスロット公衆に情報を送信する信号を宣言しています。
また、カウンタをインクリメント、10ミリ秒ごとに(私たちの友人がlerdinhos Vistaをフォローできるように!)起動されますQTimerを実装しています。 このカウンタは、表示形式や表示に送り返されます。
タイマーが停止、一時停止し、適切なボタンをクリックすると、いつでも再開できます。
Finalmentes
例自体は多くのコードはありませんが、タイマーとカスタムシグナルとスロットの構造の最も基本的な使用方法を示しています。 非常に特別な注意は、しかし、これらのリソースの使用を含む詳細に与えられるべきである、彼らは致命的なトラップになる可能性があります。
重要なリンク
シグナルとスロット
使いQTimer
QTのスレッド
QTのオンラインドキュメント
パートI、QTで開始
要求に応じて、私はQTで出かけるの起動に示す短い記事を行うことを決めた。
スペース(はい、スペースはあなたの友人、離れることはないです)、余分なヘッダーを持つapanas 20行では、我々はすでにフレームワークの主な機能を使用する "Hello World"のチャートを加えることができます。
私は他のプラットフォームでテストする方法がありませんので、私は、使用しているプラットフォームは、* nixであることを仮定していると、QTの開発ライブラリが既にインストールされていることと同様に、標準のビルドツール。 QTがインストールされていない場合は、このを見て取る時間であるリンクを 。
完全なソースコードは、例からダウンロードすることができますここで 、あなたは手でそれを行うことを好む場合は、qthelloで、次の内容とmain.cppを呼ばれるファイル内の任意の場所にディレクトリを作成します。
01#<qapplication>を含む 02#<qwidget>を含む 03#<qpushButton>を含む 04 main ( int argc , char ** argv ) 05 int型です。main(int argc、char **はargv)を 06 { app ( argc , argv ) ; 07 QApplicationのアプリ(argc、argv)の; window ; 08 QWidgetのウィンドウ; button ( "Hello World!" , & window ) ; 09ボタンQPushButton( "Hello World!"という、ウィンドウ(&W)); 10 ( 300 , 200 ) ; 11ウィンドウのリサイズ(300、200); ( 100 , 85 , 100 , 30 ) ; 12ボタンSetGeometry(100、85、100、30); 13 :: connect ( & button , SIGNAL ( clicked ( ) ) , 14はQObject :: CONNECT(&ボタン、SIGNAL(()をクリック) SLOT ( quit ( ) ) ) ; &アプリ、SLOT(quit()が)); 15 ( ) ; 16ウィンドウの表示(); app. exec ( ) ; 17戻りアプリをexec(); 19} 20
今ターミナルそのディレクトリ型qmakeは、プロジェクトを通過します。
すべてが正しくインストールされている場合は、qthello.proというファイルが作成されている必要があります。 ないqthello.proディレクトリが存在しない場合は、前の手順を確認します。
とは、すべてのqmake &&が作る端末タイプに定住した。 この例をコンパイルし、すべてが働い、qthelloと呼ばれる実行可能ファイルが作成されました。
。/ Qthelloでそれを実行し、ボタンでウィンドウが表示されます。
ソースコード:[OK]を、楽しい部分、今してみましょう。
最初の三つの行は、我々はQTを使用することをクラスに関連するヘッダーのみが含まれています。
7行目は、Qtアプリケーションを宣言し、シェルプログラムによって受信されたパラメータに渡します。 QApplicationのクラスは、プログラムとその設定のメインフローを管理します。 これは、インターフェイスやその他のソースの両方からすべてのイベントが処理され、出荷され、メインイベントループが含まれています。 また、他のものの間でプログラムの起動と停止を管理します。
8行目は、私たちの主なグラフィック要素となるウィジェットを宣言します。
9行目は! "Hello World"というテキストを持つボタンを宣言し、それは私たちのメインウィジェットの "息子"になります。 このボタンがメインウィジェットに表示されるようになります。
ライン11:12形状と位置のコンポーネントを構成します。
14行目は、フレームワークの主な特徴の一つは、Signalスロットシステムを示しています。
シグナルとスロットはオブジェクト間の通信を実現するために使用されています。 このシステムを介して1つ(またはそれ以上)のオブジェクト(s)で捕捉して処理することができるオブジェクト(放出する)イベント(信号)を撮影することができます。 シグナルとスロットは、クラスの特殊なメソッドです。 基本的には、信号の放射が通過スロットに呼び出しに変換されMOC(メタ·オブジェクトのコンパイラ)のコンパイル前に前処理のソースコード、。 シグナルとスロットを実装する各クラスのために、それは、コードの残りの部分と一緒にコンパイルされているmoc_nomedaclasse.cppと呼ばれるファイルを生成します。 これは、すべて透過的に行われており、プログラマは、通常、これらの詳細について心配する必要はありません。 具体的には、connectの呼び出しを介してそれに関連付けられているスロットはシグナルに渡された同じパラメータを使用して何らかの方法で信号signigicaを発する。 より詳細な情報はオンラインマニュアルで確認することができます。
この例では、リンクがスロット)が(オブジェクトの実装を終了すると、オブジェクトのボタンをクリック()シグナルを接続します。 これは、ボタンをクリックすると、信号がトリガされ、その後、アプリケーションオブジェクトでキャプチャして、プロセスが終了されることを意味します。
それが見えるようになるように16行目では、ウィジェットのshow()メソッドを呼び出します。
17行目では、我々は最終的にQTのためのプログラムを制御します。 exec()メソッドは、メインループとそのすべてのメカニズムを起動し、アプリケーションが終了されている場合にのみ返されますが、私たちの場合、app.quit()はシステムのシグナルスロットを介して呼び出されたとき。
この単純な "Hello World"は愚かに聞こえるかもしれませんが、それはメインループは、グラフィカルオブジェクトの作成とシグナルとスロットを使用すると、QTのいくつかの重要な機能を発揮するのに十分です。
次の投稿で、私は我々自身のシグナルとスロットとタイマーの使用を作成するために表示されます。
参照:
QApplicationの
QWidgetの
QPushButton
シグナルとスロット
QTとマルチウィンドウ用のシンプルなインターフェイスマネージャを構築する
幾度も私は、グラフィックまたはテキストモードかどうか、多くのスクリーンでメンテナンス·システム·インタフェースを与えるためになってしまった。 多くの場合、画面の数は常にあいまいな呼び出し、#ifndefs、スイッチ、および他のモンスターのもつれにつながった事前の計画、せずにシステムと一緒に成長してきました。
私は後半のようなゲームの最初のバージョンをやっていた時、私はジェンダーの問題に遭遇した初めてだったElifoot CEFETESの公正へ。 当時、私は彼らが互いに呼び出された関数の集合を越えて来て、唯一の目標が起こったときに返される。 その結果がスタック! (この新しいバージョンで修正されました、心配しないでください!)
複数のウィンドウを持つインターフェイスの場合、計画は、オンザフライで発生したシステムでは、破壊と恐怖の足跡を残して、上のウィンドウなどを閉じる前に他のウィンドウを呼び出してウィンドウを持っているのが一般的です。 私を信じて、あなたは今までそのようなラップのメンテナンスを引き継ぐことをしたくはありません。
ほこりにほこり...
私の場合、resoviインターフェイスマネージャを作成することにより、問題。 インタフェース·オブジェクトの作成と破棄を制御する集中型のオブジェクトです。 各オブジェクトは、それらのタスクマネージャのための信号を終了すると、彼は混乱をクリーンアップするの面倒を見る。 したがって、オブジェクトが生まれされるたびに、前方に、プログラムの制御を渡さずに死ぬと、そのタスクを実行し、それは常にマネージャに戻ってくる。
私はマネージャーがオブジェクトを破棄することを言いませんでしたが、それはクリーニングを行いますので注意してください。 各オブジェクトには、マネージャーに彼が成功したか、終了または失敗するたびに警告を表示するために構築する必要があります。 多くの場合、オブジェクト自体が "殺す"ことができると一人でいるワークマネージャの一部ではなく、コントロールしながら、非常に便利です。
開始する前に
私はこの単純なポストはすべてのQTの機能または管理インターフェイスのすべての側面をカバーすると主張していません。 私がやっているために問題を解決する方法について話すつもり私は思います。 このポストはまた、そのようなパイナップル皮を余儀なくされた友人サンパウロ·リオデジャネイロへのオマージュです!
実践的な
私は、ほとんどの場合、プログラマはボトムアップ、トップダウンのアナリスト。 これは混乱に見えるかもしれませんが、ほとんどパニック、またはする理由はありません...
オブジェクトがメッセージを交換する必要があります。 このため、システムのシグナルスロットQTは大きな助けになるでしょう。 オブジェクトがシグナルを送信します(放射(信号))とマネージャー(スロット())、それらに耳を傾けます。
驚くべきことに、UIMと呼ばれる今からマネージャのビルダーは、1行のコードを持っていません。 それはただ単にパラノイア(またはしない)ためには、0へのポインタを初期化します...
UIMは、オブジェクトを作成し、混乱を洗浄するためのスロットを実装しています。 あなたがオブジェクトを作成すると、UIMは、それぞれのスロットのクリーニングにこのオブジェクトを接続します。 オブジェクトが死んだときには、UIM内のクリーニングスロットをアクティブにします。 スロットは、オブジェクトグラフの作成この例では、メインメニュー、ウィンドウにリンクされます。
他のオブジェクトはすべての後に、マーケティングが重要である、自分自身(約)について話をする小さいウィンドウ、ダイアログ、アプリケーションのコンフィギュレーションのためのもの、および2です。...
私は道を得るために調整してクリックしてQt Designerをドラッグして、すべてのグラフィックオブジェクト。 手にピクセルを整列するものは、すべての後にのみコンセプトの証明である芸術作品ではありませんありません。
グラフィックオブジェクト
セットアップ画面では、パラメータのリストがウィジェットのページに渡されるコンボボックスを使用してコモンダイアログです。 私はQt Designerによって生成されたコードを追加しました詳細は、デストラクタを持っており、ペアのシグナル - スロットマネージャに戻って、選択したデータを送信することができます。 私は、現在の設定を追跡するために気にしませんでした。 このチャットは別のポストのためのものです。
aboutsは基本的に同じコードと、デストラクタであった。
メインウィンドウには、他のウィンドウと点滅している正方形の完全な狂気のウィジェットを呼び出して、メニューを持っています。 正方形は、ウィンドウの設定を変更する情報の量です。
マジックQT
そのクラスはQWidgetクラスから継承するため使用されるすべてのグラフィカル·オブジェクトもQWidgetsであり、私はそれぞれ継承したメソッドに次のコンストラクタを使用します。
この-> setAttributeメソッド(はQt :: WA_DeleteOnClose、TRUE); によると、 オンラインマニュアル 、これはそれが閉じているときに、ウィジェットを削除する必要があることをQtを伝えます。 それ以外の場合は、単に隠されています。
"...ウィジェットがクローズイベントを受け入れるとき、それは隠されている..."
あなたはそれが閉じているときはウィジェットを削除する場合は"...は、Qt :: WA_DeleteOnCloseフラグを指定して作成してください。 これは、マルチウィンドウアプリケーションで独立したトップレベルのウィンドウのために非常に有用である... "
そのようなキャンセル]または[閉じる]をクリックなどの障害のオブジェクトの端を作るルーチンは、直接、独自スロットのclose()に接続されています。 これは、オブジェクトの破壊に結実する一連のイベントをトリガします。
オブジェクトであるルーチンは、UIMに戻るように指示されたときは、当該[OK]をクリックしてデータを送信すると、正常に完了したので、ルーティングすることもできます。 データを取得した後、UIMスロットは、直接オブジェクトのclose()を呼び出します。
オブジェクトが破棄されるとき、彼は彼の最後の息、言う、(破壊された記号)を送信します。 文字通り、彼は "私はでした!"叫んだ。
"外部"オブジェクトから、UIMは、日常の清掃とTADÃMこの信号を接続し、待機している! 準備ができました。
私が使用した例では、画面上の正方形の額は、オブジェクトのMyConfが来ると、UIMを通過するにはMyApplicationをにルーティングされます。 それを転送クレイジー内部ウィジェットに順番にこの。
小さいウィンドウが開いている間、さらに面白くするために、ウィジェットはハッチが閉じられたときに戻って、点滅が停止します。 それは愚かに聞こえるかもしれないが、彼女にフォーカスがないかにいたとき、それは、単にUIMは、各ウィンドウに何が起こるかを完全に制御sobreoを持っていることを示すことでした。
結論
QTフレームワークは、計り知れない巨大な範囲の機能を提供します。 一つは、オブジェクトが破棄される方法を制御することができます。 シグナル-スロットシステムとの少しの計画と一緒でこれを一緒に使用することにそれを回すことなく、非常に複雑なインターフェースを構築することができますTarrasque維持するための時間。
ソース:
PS:完全なソースコード例では、GPLの下にあり、これを介してダウンロードすることができますリンクをクリックします 。 ある日私はそれにコメントを入れ...
BUGFIX
不幸な昆虫は、クラスコンストラクタMySquaresの初期化プロパティが存在しない場合に隠した。 ペット、 "セグメンテーション違反"を引き起こすので、小さいが、有毒であったが。 私はどこでも約あった、と閉じた場合、プログラムを起動すると、それは画面がすでに正しく設定されていることを前提から始まった一連のイベントを撮影しました。 修正されたコードは、上記のリンクであり、覚えておいてください。
"常に使用する変数を初期化"



