qt でのプログラミング c. 私が Qt を愛している理由、そして皆さんも Qt を愛すべきです。 はじめに - Qt グラフィックス ライブラリ

09.07.2020

KDE が Qt ライブラリに基づいていることは誰もが知っていますが、それが何であるかを知っている人はいません。

Qt は、TrollTech のグラフィカル ユーザー インターフェイス (GUI) を作成するためのクロスプラットフォーム C++ クラス ライブラリです。 このライブラリは完全にオブジェクト指向であるため、機能の拡張や新しいコンポーネントの作成が簡単になります。 Windows 95/98/NT/2000、Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX などの膨大な数のプラットフォームをサポートしています。 1996 年に Qt の最初の商用バージョンが登場して以来、数百の有名なアプリケーションが世界中に登場しました。 Qt をベースにした最も有名な開発は、多くの人がすでに推測しているように、KDE ​​と呼ばれる X-Windows 用のデスクトップ マネージャーです。

Qt ライブラリには無料と有料の 2 つのバージョンがあります。 Qtと呼ばれる無料版 無料版 Unix/X11 およびオープンソース開発のみを対象としています。 Qt Professional Edition は、商用プログラムの開発を目的としています。

GUI ライブラリの場合、オブジェクト指向言語が唯一の適切なツールであり、標準 C++ オブジェクト モデルにより、効率的かつ高速なプログラム開発、無制限の拡張、および迅速な最新化が可能になります。 当然のことながら、このため、ライブラリの基本言語として C++ が選択されました。 しかし、言語自体の機能に加えて、Qt ライブラリにはいくつかの機能が追加されています。 良い機会:

  • シグナルとスロットを使用したオブジェクト間の通信のための強力なメカニズム
  • C++ コンパイラがサポートしていないオブジェクトのプロパティを作成するメカニズム
  • イベントとイベントフィルターのサポート
  • 国際化をサポートするための文字列変換
  • 内部タイマーのサポート。これにより、イベント駆動型 GUI の多くのタスクを統合できます。
  • 家系図の一種であるオブジェクトの階層ツリー:「曾祖父 - 祖父 - 父 - 息子」。内部の相互作用を「自然な」形式で組織化することを目的としています。
  • 参照されたオブジェクトが削除されると自動的に NULL に設定される「保護された」ポインター

これらすべての機能は、特別な C++ クラスの形式で実装されます。 新しい現代の要件の出現 ユーザーインターフェースこれには、プログラミング言語自体では提供できない、特殊なクラスの作成後にのみ提供できる、新しい非標準メカニズムの出現が伴います。

X-ストレンジャー

Linux.HiTECH.BY サイトのマテリアルの使用は、ソースを参照することによって許可されます。
マテリアルは GNU/GPL に基づいて配布されます。

講義と研究室での仕事

料金別:オペレーティングシステム

トピックについて: Qtプログラミング環境

完了:

グループA-06-09の生徒

スミルノフ・アンドレイ

マルギン・ミハイル

1.はじめに

2.歴史

3.環境整備

4.適用範囲

5.一般情報

6.コンポーネント

7.開発環境

8.Qt Creator の使用

9.例

10.タスク 実験室での仕事

導入

また、他の多くのプログラミング言語 (Python - PyQt、Ruby - QtRuby、Java - Qt Jambi、PHP - PHP-Qt など) への「バインディング」もあります。

最新のソフトウェアを使用して作成されたソフトウェアを実行できます。 オペレーティングシステムソースコードを変更することなく、OSごとにプログラムをコンパイルするだけで実現できます。 アプリケーションの開発時に必要となる可能性のあるすべての主要クラスが含まれています ソフトウェアグラフィカル インターフェイス要素から、ネットワーク、データベース、XML を操作するためのクラスまで多岐にわたります。 Qt は完全なオブジェクト指向であり、簡単に拡張でき、コンポーネントベースのプログラミング手法をサポートしています。

バージョン 4.5 以降、Qt はさまざまなライセンスに基づいて配布されています。 これは、商用アプリケーションを作成する場合は、商用 Qt ライセンスを購入する必要があることを意味します。 オープンソース プログラムを作成している場合は、GPL ライセンスのバージョンを使用できます。

Qt 開発ツールが初めて一般に知られるようになったのは 1995 年 5 月です。 Qt はもともと Haarvard Nord と Eric Chamb-Ing によって開発されました。

1991 年にハーバード氏は、Eric 氏と共同で設計上の決定を行い、実質的に Qt を形成するクラスの作成を開始しました。

翌年、Irick は「シグナル アンド スロット」というシンプルだが強力な GUI プログラミング パラダイムを思いつき、現在では他のいくつかのツールで採用されています。

1993 年までに、Haarward と Irik は最初の Qt グラフィックス エンジンを開発し、独自のウィジェットを作成できるようになりました。

面白くないメモ: 文字「Q」がクラス接頭辞として選ばれたのは、Haarward が使用した Emacs フォントで見た目が良かったからです。 「ツールキット」を表す文字「t」が追加されました。

発達

1995 年 4 月、ノルウェーの会社 Metis は、Qt に基づくソフトウェアを開発する契約を締結しました。

1995 年 5 月 26 日 - Qt の最初の公開バージョン。 Qt は Windows 開発と Unix 開発の両方で使用できます。 ソフトウェアインターフェース両方のプラットフォームで同じでした。



1996 年から 2001 年まで - バージョン Qt3 まで開発。 Qt は Windows、Mac OS X、Unix システムで動作するようになりました。

2005 年夏 - Qt 4.0 がリリースされました。 約 500 のクラスと 9,000 を超える関数を備えた Qt 4 は、以前のバージョンよりも大きく、より豊富です。 開発者が必要な Qt の部分だけを使用できるように、いくつかのライブラリに分割されています。

現在のバージョンはQt4.8です

Qt 4 は、 以前のバージョン; これには、強力で使いやすいコンテナ クラスのまったく新しいセット、改善されたモデル/ビュー アーキテクト機能、高速で柔軟な 2D グラフィック フレームワーク、Unicode テキストを表示および編集するための強力なクラスが含まれており、言うまでもなく、全体にわたる数千の小さな改善が含まれています。 Qt クラスの全範囲。

Qt 4 は、商用開発とオープンソース開発の両方でサポートされているすべてのプラットフォームで利用できる Qt の最初のバージョンです。

適用範囲

Windows、Linux、Mac OS X 用のデスクトップ アプリケーションを作成する機能 (コンソールとウィンドウ グラフィカル インターフェイスの両方)。 ここ数年、生産数は増加傾向にあります。 モバイルデバイス。 その結果、Qt はモバイル プラットフォーム (Symbian、Maemo、MeeGo) に移植されました。 また、Qt Lighthouse を Android プラットフォームに移植した成功体験についても知っています。

一般情報

ソース コードを変更せずに各 OS 用にプログラムをコンパイルするだけで、そのヘルプを使用して作成されたソフトウェアをほとんどの最新のオペレーティング システム上で実行できます。

グラフィカル インターフェイス要素から、ネットワーク、データベース、XML を操作するためのクラスに至るまで、アプリケーション ソフトウェアの開発時に必要となる可能性のあるすべての基本クラスが含まれています。

Qt は完全なオブジェクト指向であり、簡単に拡張でき、コンポーネントベースのプログラミング手法をサポートしています。

ライブラリには次のバージョンがあります マイクロソフト Windows、X11 グラフィックス サブシステムを備えた UNIX クラスのシステム、iOS、Android、Mac OS X、Microsoft Windows CE、QNX、組み込み Linux システム、および S60 プラットフォーム。 現在、Qt サポートを導入する可能性を検討しています。 Windows Phone。 Haiku への移植も進行中です。

特徴的な機能他のライブラリからの Qt - 使用 メタオブジェクトコンパイラ (MOC)- 予備的なソース コード処理システム (一般に、Qt は純粋な C++ 用ではなく、その特別な言語用のライブラリであり、その後の標準 C++ コンパイラによるコンパイルのために MOC がそこから「変換」されます)。 MOC を使用すると、スロットやシグナルなどの概念を導入することにより、ライブラリの能力を何倍にも高めることができます。 さらに、これによりコードをより簡潔にすることができます。 MOC ユーティリティは、C++ ヘッダー ファイルで Q_OBJECT マクロを含むクラス定義を検索し、メタオブジェクト コードを含む追加の C++ ソース ファイルを作成します。

Qt を使用すると、独自のプラグインを作成してパネルに直接配置できます。 ビジュアルエディター。 また、画面上での配置、表示、ウィンドウ サイズ変更時の再描画に関連するウィジェットの通常の機能を拡張する可能性もあります。

Qt には、Qt Designer と呼ばれるビジュアル GUI 開発環境が付属しており、WYSIWYG モードでダイアログやフォームを作成できます。

Qt ディストリビューションには、プログラムのローカリゼーションと多くの言語への翻訳を簡素化できるグラフィカル ユーティリティである「Qt Linguist」が含まれています。 「Qt アシスタント」 - ライブラリ ドキュメントの操作を簡素化する Qt ヘルプ システムで、Qt に基づいて開発されたソフトウェアのクロスプラットフォーム ヘルプを作成することもできます。 バージョン 4.5.0 以降、Qt キットには、コード エディター、ヘルプ、 グラフィックツール「Qt Designer」とアプリケーションをデバッグする機能。 「Qt Creator」はコンパイラとしてGCCまたはMicrosoft VC++、デバッガとしてGDBを利用できます。 のために Windowsのバージョンこのライブラリには、コンパイラ、MinGW ヘッダー、オブジェクト ファイルが付属しています。

コンポーネント(いくつかハイライトしてみましょう )

ライブラリはいくつかのモジュールに分割されており、ライブラリの 4 番目のバージョンでは次のようになります。

Qtコア- 他のモジュールによって使用されるライブラリのコア クラス。

QtGui- グラフィカルインターフェースコンポーネント;

Qtネットワーク- ネットワーク プログラミング用のクラスのセット。 さまざまな高レベル プロトコルのサポートはバージョンごとに異なる場合があります。 バージョン 4.2.x には、FTP および HTTP プロトコルを操作するためのクラスが含まれています。 QTcpServer、TCP 用の QTcpSocket、UDP 用の QUdpSocket などのクラスは、TCP/IP プロトコルで動作するように設計されています。

QtOpenGL- OpenGL を操作するためのクラスのセット。

QtSQL- 構造化言語を使用してデータベースを操作するためのクラスのセット SQLクエリ。 バージョン 4.2.x のこのモジュールの主なクラス: QSQLデータベース- データベースへの接続を提供するクラス。特定のデータベースを操作するには、QSqlDriver クラスから継承されたオブジェクトが必要です。QSqlDriver クラスは、特定のデータベース用に実装され、コンパイルにデータベース SDK を必要とする場合があります。 たとえば、FireBird/InterBase データベース用のドライバを構築するには、このデータベースの配信キットに含まれる .h ファイルと静的リンク ライブラリが必要です。

QtScript- Qt スクリプトを操作するためのクラス。

QtSvg- スケーラブル ベクター グラフィックス (SVG) データを表示および操作するためのクラス。

QtXml- XML を操作するためのモジュール。SAX および DOM 作業モデルをサポートします。

Qtデザイナー- 独自のウィジェット用の QtDesigner 拡張機能を作成するためのクラス。

QtUIツール- アプリケーションで Qt Designer フォームを処理するためのクラス。

Qtアシスタント- ヘルプシステム;

Qt3サポート- Qt ライブラリ バージョン 3.x.x との互換性に必要なクラスを含むモジュール。

Qtテスト- UNIT テストを操作するためのモジュール。

QtWebKit- WebKit モジュールは Qt に統合され、そのクラスを通じてアクセス可能です。

QtXmlパターン- XQuery 1.0 および XPath 2.0 をサポートするモジュール。

フォノン- ローカル、デバイス、ネットワーク経由の両方で、ビデオとオーディオの再生と記録をサポートするモジュール。

QtCLucene- 全文検索をサポートするモジュール。Qt 4.4 の新しいバージョンのアシスタントで使用されます。

ActiveQt- Windows 上の Qt 開発者向けに ActiveX および COM テクノロジを操作するためのモジュール。

Qt宣言型- 動的でカスタマイズ可能なユーザー インターフェイスを作成するための宣言型フレームワークを提供するモジュール。

このライブラリは、.pro ファイルと呼ばれる独自のプロジェクト形式を使用します。このファイルには、どのファイルがコンパイルされるか、ヘッダー ファイルを検索するパスやその他多くの情報が含まれています。

その後、qmake ユーティリティを使用して、コンパイラの make ユーティリティ用の makefile を作成します。 Microsoft Visual Studio 2003/2005/2008/2010 のインテグレーターを使用して作業することもできます。 ごく最近、Eclipse への統合がライブラリのバージョン 4.x.x で利用できるようになりました。

Java 開発者は、同じメーカーの Qt Jambi フレームワークを使用して Qt を使用できます (Qt Software は 2009 年にこのフレームワークの開発を正式に中止しました)。

«+»

Qt プロジェクトの大きな利点の 1 つは、高品質のドキュメントが利用できることです。 ドキュメント記事が提供されています 多数の例。 ソースコードライブラリ自体は適切にフォーマットされており、広範囲にコメントが付けられており、読みやすいため、Qt の学習も容易になります。

開発環境

Qt Creator は、C、C++、QML で開発するためのクロスプラットフォームの無料 IDE です。 Qt フレームワークと連携するために Trolltech (Nokia) によって開発されました。 QtWidgets と QML の両方を使用したグラフィカル デバッガー インターフェイスとビジュアル インターフェイス開発ツールが含まれています。 サポートされているコンパイラ: Gcc、Clang、MinGW、MSVC、Linux ICC、GCCE、RVCT、WINSCW。

Qt Creator の主な目標は、さまざまなプラットフォーム上で Qt フレームワークを使用してアプリケーション開発を簡素化することです。 したがって、あらゆる開発環境に固有の機能の中には、QML でのアプリケーションのデバッグや、QML と QtWidgets の両方に組み込まれたインターフェイス デザイナーであるデバッガーでの Qt コンテナーからのデータの表示など、特定の機能もあります。

Qt Creator での作業

Qt Creator には、新しいプロジェクト、フォーム、クラス ファイルなどを作成するための便利な「ウィザード」が用意されています。 ただし、メイン ウィンドウの ui ファイルを作成する代わりに、ビジュアル プログラミングの領域に触れることなく、プロジェクトに簡単なコードを挿入することもできます。 プロジェクトを作成または開くと、開発環境自体が目の前に表示されます。 最初、彼女は普通ではないように見えます。 たとえば、有名なタブ(棘のあるタブ)はありません。 というか、エディタ ファイル以外のすべてのものに存在します。 ファイル自体は、プロジェクト ファイル (デフォルトでは左側のパネル) とプロジェクト ファイルの 2 つのリストから入手できます。 ファイルを開く(V トップラインエディタパネル)。 なぜタブを廃止しようと思ったのですか? 画面スペースを節約するためだと思います。

もう 1 つの珍しい点は、「ダイアログなし」インターフェイスが他のプログラム (TEA エディターなど) で長い間採用されてきたため、非常に相対的なものです。 Qt Creator では、テキストを検索および置換するための入力フィールドが表示され、テキストを入力すると、見つかった一致がエディターですぐに強調表示されます。 さらに検索するには F3 キーがあり、置換するには別の入力フィールドがあります。 オプションも近くにあります。 これらすべてのおかげで、そのような操作は迅速かつ便利に実行されます。 同じことが情報パネルとデバッグパネルにも当てはまります。モダリティの欠如、メインウィンドウと重複する不要なウィンドウ、およびインターフェイスアーキテクチャへの前者のアプローチのその他の利点です。 すべてが 1 つのメイン ウィンドウに表示されます。

Qt Creator はコード エディターも担当しました。 最近では構文の強調表示に驚く人はほとんどいないので、すぐに他の説明に移りましょう。 有益な機会。 たとえば、「フル コード パーサー」があります。これは、プログラミング言語の観点からコードが正しいかどうかをチェックするエディターの機能です。 コードを入力すると、コンパイル前にどこで構文エラーが発生したかを確認できます。 例外もありますが、ほとんどの場合は機能します。 自動補完はうまく機能します。クラス インスタンスの名前を入力し、ドットまたは「->」を入力すると、クラス メンバーを含むドロップダウン リストが表示されます。 コードブロックの折りたたみ、いわゆる「フォールディング」があります。 ただし、私はこのオプションを使用しないほうがコードが明確になると考えているため、このオプションを使用することはありません。

コード内のナビゲーションはよくできており、外部 ctag はありません。 関数または変数の名前にカーソルを置き、F2 キーを押すだけで、エディターが宣言の場所に移動します。 Shift-F2 - 宣言とコードを切り替え、F4 - ヘッダーと cpp ファイルを単純に切り替えます。 コード内で呼び出される関数の名前の上にマウス ポインターを移動すると、そのパラメーターに関するヒントが表示されます。

ヘルプシステムは次のように動作します。 コードのどこかに QMenu のような変数があるとします。 カーソルをその上に置いて F1 を押すと、QMenu クラスの説明を含むヘルプ パネルが表示されます。 メイン ウィンドウには [ヘルプ] タブもあり、すべての Qt ドキュメントが利用可能です。

そのため、ほとんどの時間をエディター タブで過ごすことになります。 Qt Creator の設定に、デフォルトでスクリプト、C++、プロジェクト、Perforce (商用バージョン管理システム) など、さまざまなエディターに 5 つものセクションがある理由は完全には明らかではありません。 C++ エディターの設定は、Qt プログラムのコード エディターの設定です。 Qt Creator の最新の「スナップショット」では、フォント設定が依然として 1 つのセクションに編成されていることに注意してください。これは予想通りです。

デフォルト設定はあまり使いにくいため、バックライトとフォントをセットアップすると便利です。 第一に、フォント サイズが小さすぎます。第二に、#ifdef / #endif で囲まれたコード ブロックはパーサーによって「無効なコード」(Qt Creator 設定の表現)として解釈され、灰色で表示されます。これはあまり便利ではありません。書かれていることを解析します。 「折りたたみ」が気に入らない場合は、エディターの設定で [折りたたみマーカーの表示] を無効にしてください。

エディターのフィールドにブックマークとブレークポイントを設定できます。 Konqueror と同様に、エディタ パネル自体は無限の数のネストされたパネルに分割できます。 したがって、画面上で複数のファイルを同時に編集することも、同じドキュメントを別の場所で編集することもできます。 これを行うには、まずエディター パネルを分割し (たとえば、[ウィンドウ - 上部/下部の分割] を使用)、次にメニュー項目 [ウィンドウ - ドキュメントの複製] を選択する必要があります。 このアプローチは、ブックマークによる退屈なナビゲーションよりも役立つ場合があります。

Qt Creator のアーキテクチャはプラグインに基づいています。 エディターはプラグイン、ブックマーク エンジンはプラグイン、プロジェクト ファイルを含むパネルもプラグインなどです。 リスト インストールされているプラ​​グイン[ヘルプ - プラグインについて] メニューにあります。 おそらく将来的には追加のプラグインをインストールできるようになるでしょうが、今のところそのためのメカニズムは発見されておらず、追加のプラグイン自体も見つかりませんでした。 しかし、アセンブリ自体では、新しいプラグインが前例のないスピードで登場します。 わずか 1 か月で、Subversion と Git のサポート モジュールが登場しました。 Qt Creator は一般的に本質的に一時的なものになりました。 Qt Creator のメニュー項目はバージョンごとに名前が変更され、他のサブメニューに移動されます。 言うまでもなく、追加機能は常に生まれています。

設定ウィンドウに少し注目してみましょう。幸いなことに、設定ウィンドウにはたくさんのウィンドウがあります。 キーボード ショートカットをカスタマイズしたり、外部ファイルを使用してインポート/エクスポートしたりすることができます。 これは、お気に入りのキーボード ショートカットをマシン間で転送するのに便利です。 Qt Creator には、MS Visual C++ と Xcode 用の 2 つのプレインストール ファイルがデフォルトで含まれています。 自動補完、インデント、構文の強調表示などに関連するすべては、エディターの設定 (テキスト エディター) にあります。

Qt Creator のもう 1 つの興味深いツールは Locator (古いバージョンでは - クイック検索) です。 フォーカスを移動するには、Ctrl-K を押すだけです。 これは通常の検索バーのように見えますが、必要なものをすばやく検索するために使用されます。 具体的には、ファイル、クラス、関数内のファイルを検索します。 検索タスクを絞り込むための修飾文字をサポートします。 たとえば、Qt ドキュメントで qApp グローバル ポインターの説明を参照するとします。 何をするか? 以前は、ブラウザーでドキュメントを開いて検索する必要がありました。 しかし、Qt Creator では、Locator が常に手元にある場合、検索バーに入力するだけで十分でしょうか? qappを選択し、Enterを押します。 行番号 100 に進みますか? 番号をダイヤルしてもう一度入力してください。

最後に、GDB デバッガーとの対話に戻りましょう。 Qt Creator では、グラフィカル インターフェイスを通じて、現在のプロジェクトだけでなく、任意のプロジェクトをデバッグできます。 外部プログラム- もちろん、デバッグ情報を含めてコンパイルされている場合です。 デバッグ中、スレッド、変数、ブレークポイント、逆アセンブラーなど、さまざまなタイプのデータが個別のタブに表示されます。 QStringList インスタンスはデバッガーで特に明確に表示され、そのすべての要素が表示されます。 GDB 自体の標準出力は、プロセッサ レジスタの内容に関する情報などの他のいくつかのタブと同様に、デフォルトでオフになっています。 プログラムが何らかの理由でクラッシュした場合、デバッグ パネルのデータには、コード内のどこでエラーが発生したかがすぐに表示されます。

例1

最初のプログラムはグラフィカル ユーザー インターフェイス (GUI - グラフィカル ユーザー インターフェイス) を使用します。

#含む

#含む

int main(int argc, char *argv)

QApplication app(argc, argv);

QPushButton *newbtn = 新しい QPushButton(QObject::tr("OK"));

QObject::connect(newbtn, SIGNAL(clicked()), &app, SLOT(quit()));

newbtn->resize(180,40);

newbtn->show();

app.exec()を返します;

最初の 2 行は Qt クラス定義です。

これらのクラスは、Qt ライブラリのアプリケーション プログラミング インターフェイス (API) に属します。 ライブラリには、これらのクラスを説明する同じ名前のファイルが含まれています。

6 行目では QApplication オブジェクトを作成します。 このクラスは、すべてのアプリケーション リソースを管理します。 次に、QPushButton クラスのオブジェクトが「OK」という文字とともに作成されます。

ボタンはウィジェットです。 8 行目は、ボタンの clicked() 信号を QApplication3 オブジェクトの quit() スロットにバインドするために使用されます。 9 行目でウィジェットのサイズを設定し、10 行目でウィジェットを表示します。 11 行目は、Qt アプリケーションの制御を転送するために使用されます。 この時点で、プログラムはユーザー イベントとシステム イベントを処理するループに入ります。

例 2: ユーザー入力の検証

ユーザーがテキスト フィールドにデータを入力するように求められると、まったく予期しない結果が得られることがよくあります。 ユーザーが単語内に数字を入力したり、間違った小数点記号を使用したり、市外局番を入力し忘れたりする可能性があります。 電話番号。 このため、多くの場合、指定された情報の正当性(正当性)1を確認する必要があります。

Qt には、入力されたデータが正しいことを保証する QValidator クラスが含まれています。 データ クラスを直接使用することはできません。 データをチェックするには、既製のサブクラス QIntValidator、QDoubleValidator、QRegExpValidator を使用するか、自分でサブクラスを作成する必要があります。

validate(QString & input, int & pos) メソッドには、チェックする文字列とカーソル位置が渡されます。 このメソッドは次の値を返すことができます。

QValidator::Invalid - 文字列が無効です。

QValidator::Acceptable - 文字列は許容されます。

QValidator::Intermediate - 文字列は現在の状態では受け入れられませんが、有効になる可能性があります。

文字列が実数かどうかをチェックするプログラムを書いてみましょう。 既製の QDoubleValidator クラスを使用してみましょう。

メインウィンドウ::メインウィンドウ()

グリッド = 新しい QGridLayout; doubleedit = 新しい QLineEdit;

lbdouble = new QLabel(tr("Double:"));

lbresult = new QLabel(tr("結果:"));

結果 = 新しい QLabel;

vld = 新しい QDoubleValidator(-5, 2999, 5, this);

vld->setNotation(QDoubleValidator::ScientificNotation);

doubleedit->setValidator(vld);

グリッド->addWidget(lbdouble, 0, 0);

グリッド->addWidget(doubleedit, 0, 1);

グリッド->addWidget(lbresult, 1, 0); Grid->addWidget(result, 1, 1);

サイズ変更(160, 120); setLayout(グリッド); ...

QDoubleValidator クラス コンストラクターは、次のパラメーターを受け入れることができます。

QDoubleValidator::QDoubleValidator (ダブルボトム、ダブルトップ、int 10 進数、QObject * 親)

実数の範囲は下から上までです。 小数点 - 小数点以下の桁数2。

QDoubleValidator クラスの setNotation(Notation) メソッドを使用すると、科学表記法の有効性を設定できます。

QDoubleValidator::StandardNotation - 標準表記法 (例: 1.124 または -2)。

QDoubleValidator::ScientificNotation - 科学的記数法、つまり 数値には指数部分が含まれる場合があります (例: 2.7E-3 または 3.3E+2)。

入力されたデータの有効性を確認するには、 validate() メソッドを使用します。

メインウィンドウ::メインウィンドウ()

QObject::connect(doubleedit, SIGNAL(textChanged (const QString &)), this, SLOT(showresult(const QString &)));

void MainWindow::showresult(const QString &text)

QString numtext = テキスト;

if (vld->validate(numtext, pos) == 0) result->setText(tr("invalid"));

if (vld->validate(numtext, pos) == 1) result->setText(tr("Intermediate"));

if (vld->validate(numtext, pos) == 2) result->setText(tr("Acceptable"));

プログラムコード

main.cpp

#含む

#include "メインウィンドウ.h"

int main(int argv, char **args)

QApplication app(argv, args);

MainWindow ウィンドウ。

app.exec()を返します;

Mainwindiw.h#ifndef MAINWINDOW_H#define MAINWINDOW_H #include class MainWindow: public QWidget( Q_OBJECT public: MainWindow(); プライベートスロット: void showresult(const QString &); private: QGridLayout *grid; QLineEdit *doubleedit; QLabel *lbdouble, *lbresult, *result; QDoubleValidator *vld;); #endif メインウィンドウ.cpp#含む #include "mainwindow.h" MainWindow::MainWindow())(grid = new QGridLayout; doubleedit = new QLineEdit; lbdouble = new QLabel(tr("Double:")); lbresult = new QLabel(tr("Result:" ) ); 結果 = 新しい QDoubleValidator(-5, 2999, 5, this); doubleedit, 0, 1); グリッド->addWidget(result, 1, 1); QObject::connect(const QString & ))、これ、SLOT(showresult(const QString &)));) void MainWindow::showresult(const QString &text)( int pos = 0; QString numtext = text; if (vld->validate(numtext, pos) = = 0) result->setText(tr("invalid")); if (vld->validate(numtext, pos) == 1) result->setText (tr("Intermediate")); (numtext, pos) == 2) result->setText(tr("Acceptable"));)

例 3. 2D グラフィックス

QPainter クラスを使用すると、QPaintDevice クラスから継承された任意のオブジェクト (QWidget、QPrinter、QImage、QGLFramebufferObject など) に描画できます。 幾何学的形状、ピクセルマップ、テキストを描画できます。 まず、QPainter を使用するときに役立つクラスを見てみましょう。

QPoint クラスと QPointF クラスは、2 次元座標系内の点の位置を指定するために使用されます。 QPoint - 整数用、QPointF - 実数用。 加算、減算、乗算、除算の演算は点に適用できます。

QPoint ポイント(5, 5);

QPoint point2(10, 10);

点を相互に比較したり、それらの座標が 0 に等しいかどうかを比較したりすることもできます。

QPoint ポイント(5, 10);

QPoint point2(5, 10);

if (ポイント == ポイント 2)

bln = point.isNull();

QSize クラスと QSizeF クラスは、サイズを格納するために使用されます。 QPoint および QPointF クラスのメソッドと同様のメソッドに加えて、これらのクラスには、グラフィック オブジェクトを拡大縮小できるようにするscale() メソッドがあります。

QRect クラスと QRectF クラスは、長方形領域 (左上隅の座標とサイズ) を格納するために使用されます。

QRectF(QPointF ポイント、QSizeF サイズ);

QLine クラスと QLineF クラスは直線を記述します。 QPolygon クラスと QPolygonF クラスは、直線で形成される閉じた図形を記述します。

QColor クラスを使用すると、色の情報を保存できます。 Qt 環境は、RGB、CMYK、HSV の 3 つのカラー モデルをサポートします。 RGB カラー モデルの場合、QRgb 構造体があります。 QColor クラス オブジェクトに色を設定するには、いくつかの方法があります。

コンストラクターにパラメーターを渡す

unsigned int red = 50;

unsigned int 緑 = 100;

unsigned int blue = 0;

unsigned int alpha = 128;

QColorマイカラー(赤、緑、青、アルファ);

QRgb rgb1 = (50, 100, 0);

QColor mycolor2(rgb1);

メソッド QColor::setRgb()、QColor::setRgba()、QColor::setRgbF()、QColor::setHsv()、QColor::setHsvF()、QColor::setCmyk()、QColor:: メソッドの使用setCmykF( )

mycolor.setHsv(200, 100, 50);

あるモデルで色を設定し、それを別のモデルで読み取ることができます。

unsigned int h、s、v;

QColor mycolor(100, 100, 100);

mycolor.getHsv(&h, &s, &v);

QPainter クラスに戻りましょう。 描画を開始するには、QPainter クラスのオブジェクトを作成し、それに描画するオブジェクトへのポインタを渡すだけです。

QPainter pnt(this);

pnt.drawLine(ライン);

void Wnd::paintEvent(QPaintEvent *event)

QLineF ライン(10.0, 80.0, 90.0, 20.0);

pnt.begin(this);

pnt.drawLine(ライン);

QWidget::paintEvent() メソッドは、再描画が必要なウィジェットで呼び出されます。

ほとんどの場合、ペイントは複数のペイント オブジェクト上の単一の QPainter オブジェクトによって行われます。 古い描画設定を保存するには (新しいオブジェクトに移動するとき)、QPainter::save() メソッドと QPainter::restore() メソッドを使用できます。 QPainter::save() はインストールスタックにプッシュし、QPainter::restore() はポップします。

図形の輪郭を描画するには、QPainter::setPen() を使用して QPen (ペン) クラス オブジェクトを QPainter クラス オブジェクトに渡す必要があります。

適切な方法を使用して、ペンのスタイル (色、太さ、線端の種類) を設定できます。

閉じた輪郭を塗りつぶすには、ブラシが使用されます。 QBrushクラスのオブジェクト。 QPen クラスと同様に、ブラシは QPainter::setBrush() メソッドを使用して設定されます。 QBrush オブジェクトまたは定義済みの BrushStyle スタイルのいずれかを渡すことができます。

QPainter pnt(this);

pnt.setBrush(QBrush(Qt::blue, Qt::VerPattern)); // 垂直シェーディング付きの青いブラシ

QPainter クラスを使用すると、オブジェクトの回転、拡大縮小、移動、およびベベルを行うことができます。 これらの操作には、rotate()、scale()、translate()、sheap() という対応するメソッドがあります。

Qt ライブラリはアンチエイリアシング技術をサポートしています。

pnt.setRenderHint(QPainter::antialiasing, true);

tl;dr - C++ でクロスプラットフォームのウィンドウ アプリケーションを作成するための Qt ライブラリ。

Qt はプロジェクトとして、グラフィカル プログラム インターフェイス (GUI) を開発するための便利なツールキットを求める C++ 開発者の要望から始まりました。 たとえば、Java ではこれらの目的のためにすぐに使用できる AWT があり、Python Tk では、C++ では同様のものは何もありませんでした。 GUI 開発だけでなく、ネットワーク、マルチメディア、その他の非常に人気のあるものを操作するためのクラスも含まれています。 開発者はこれに非常にイライラしていました。 まあ、需要があるので、供給が届くまでにそれほど時間はかかりませんでした。 1995 年に、ライブラリの最初のリリースがリリースされました。 それ以来、Qt は単なるインターフェイス開発を超えて急速に拡大してきました。

したがって、Qt は GUI を作成するためのクラスのセットとしてではなく、むしろあらゆる場面に対応するクラスの本格的なツールキットとして考慮される必要があります。 これは、アプリケーション プログラマがほぼすべてのアプリケーションを作成するために必要なすべて (またはほぼすべて) のセットです。 ライブラリの構造は論理的にコンポーネントに分割されており、コンポーネントが多数あり、それぞれが 新しいバージョン Qt には便利なクラスが増えています。

2 つの主要なコンポーネントがあります。ライブラリのコアである QtCore と、グラフィカル インターフェイスのコンポーネントを表す QtGui です。 後ほど説明しますが、作成されたプロジェクトには常にこれら 2 つのコンポーネントが含まれます (例外として、 コンソールアプリケーション、QtCore が必須の役割を果たします)。

そうですね、必要に応じて、開発者は好きなものを自由に使用できます。 ネットワークを操作するための QtNetwork を使用して、独自の Torrent クライアントを作成します。 ビデオオーディオプレーヤーを実装するための QtMultimedia。 本格的なブラウザ エンジンをアプリケーションに組み込むための QtWebEngine。 さらに多くのこと。

宣言されたクロスプラットフォーム機能が実際に存在することも注目に値します。 あるシステム (Windows、MinGW) で開発されたコードを、別のシステム (Linux、GCC) のコンパイラーでコンパイルして、 バイナリファイルそれほど苦労せずにそこを走ることができます。 実践が示しているように、アプリケーションにサードパーティのライブラリが大量にロードされると、特別な問題が発生します。

Web 開発者にとっての嬉しい特典は、C++ だけでなく、JavaScript によく似た QML 言語でもプログラムを開発できる機会があることです。 これは、モバイル アプリケーションのラピッド プロトタイピングと開発を目的とした Qt 開発の特別なブランチです。

そしてもちろん、Qt のハイライトの 1 つは Qt Creator 開発環境です。 不要な機能が過負荷になっていない Qt 上の汎用的で非常に便利な開発環境。

ポストライフから一日が経った後、私はカルマの漏れに気づき始めたので、記事内のおそらく受け入れられない表現スタイルと主観について事前にお詫びします

こんにちは、ハブラハブル!

最近、Hubrik での Qt トピックの人気に注目せずにはいられませんでしたが、それでも、コメントでは完全に虚偽で理解できないことを言う人を依然として見かけます。 この投稿では、Qt に関するいくつかの誤解を払拭し、その理由を説明したいと思います。 Java/Obj-C/.NET から Soft and Fluffy Qt に切り替える必要があります。.

このカットの下には、この問題に関する多くの感想、主観、そして私の謙虚な意見が含まれます 最も素晴らしいアプリケーション開発のためのフレームワーク。 ただし、私の記事が少なくとも技術的に有用な意味を獲得できるように、興味深い内容を追加するよう努めます。 面白い読み物になって楽しんでいただければ幸いです。

さて、行きましょうか?

ヴェッシュNo.1。 C++ API

Qt に非常に便利な API があることは周知の事実であり、具体的には、qtbase モジュールには、ほとんどの日常的なタスクに十分な数のクラスが含まれています ( Qt は単なる GUI フレームワークではありません (笑))。 STL コンテナ ラッパーについては、3 年前の記事ですでに説明しました。 文字列の操作、出力のデバッグなどのためのクラスも含まれています。

QString フルーツ = "リンゴ、バナナ、オレンジ、バナナ"; QStringList フルーツリスト = フルーツ.split(", "); qDebug()<< fruitsList; // выведет в консоль [ "apple", "banana", "orange", "banana" ] fruitsList.removeDuplicates(); fruits = fruitsList.join(", "); qDebug() << fruits; // выведет в консоль "apple, banana, orange"
Qt には、XML やデータベースを便利に操作するためのモジュールもあると言う価値があります ( おいしいおいしい MVC kutesh システムの統合)、OpenGL、オーディオ/ビデオ作品 (Phonon)、ネットワーク プログラミング、WebKit2。 平均的なプロジェクトが直面するタスクについては、90% の場合、このキッチンで十分であり、モジュールで問題が発生することはほとんどありません。

私は C++ が大好きなので、Qt がクロスプラットフォーム レベルでさまざまな重要なことをサポートしてくれることに非常に満足しています。 特に理解できない瞬間を解決しなければならなかったことが何度かありましたが、それが現状です。

ヴェッシュ2号。 Qtクイック

Qt Quick は、グラフィカル ユーザー インターフェイスを作成するための非常に洗練されたアプローチです。 JavaScript に似た宣言型言語 QML (どこで発明されたか想像してください笑) を使用すると、アプリケーションのインターフェイスのプロトタイピング時に高い生産性を実現できます。 どれでも複雑。 そして面白いのは、このように物事が進んでいくと、 JavaScript 構文を知っているデザイナーでもインターフェイスのプロトタイピングを処理できます。 関数コードの例を示さなかったら、これらはすべて空の言葉になっていたでしょう (Qt プロジェクトで詳細を見つけることができます)。

QtQuick 2.0 をインポートします Rectangle ( id: page width: 320; height: 480 color: "lightgray" Text ( id: helloText text: "Hello world!" y: 30nchors.horizo​​ntalCenter: page.horizo​​ntalCenter font.pointSize: 24; font.ボールド: true ) グリッド ( id: colorPicker x: 4; アンカー.ボトム: ページ.ボトム; アンカー.ボトムマージン: 4 行: 2; 列: 3; 間隔: 3 セル ( cellColor: "red"; onClicked: helloText.color = cellColor ) Cell ( cellColor: "green"; onClicked: helloText.color = cellColor ) Cell ( cellColor: "blue"; onClicked: helloText.color = cellColor ) Cell ( cellColor: " yellow"; onClicked: helloText.color = cellColor ) セル ( cellColor: "steelblue"; onClicked: helloText.color = cellColor ) セル ( cellColor: "black"; onClicked: helloText.color = cellColor ) )

Cell オブジェクトの実装は非常に簡単で、次のように定義されます。

import QtQuick 2.0 item ( id: コンテナー プロパティのエイリアス cellColor: rectangle.color signal clicked(color cellColor) width: 40; height: 25 Rectangle ( id:rectangle border.color: "white"nchors.fill:parent ) MouseArea (アンカー。 fill:親onClicked:container.clicked(container.cellColor) ) )

このコードには C++ が 1 行も含まれておらず、正常に動作します。 いいですね。 まるで魔法使いになったような気分さえしました。このようなアプリケーションを作成するよりも、店にパンを買いに行くほうが簡単です。 ただし、複雑なアプリケーションでは、QML だけでは不十分なので、C++ と組み合わせます。 これについては、Qt ソフトウェア ハブに関する多くの記事で説明されています (例: )。

ヴェッシュ3号。 コミュニティ

さて、楽しい瞬間がやってきました。 私自身について言えば、Qt を使用した期間は比較的短く、わずか 5 年です。 Qt は、Qt Developer Days と Qt Contributors "Summit" という年次イベントを開催しています。私はそれぞれのイベントに昨年一度参加しましたが、とても気に入りました。準備のレベルは高く、印象は伝わってきました。また、 Qt の「ベテラン」、つまりサミットに 10 年間参加している人々とコミュニケーションを取ることができます。このようなプロジェクトの成長を目の前で見たり、すべての開発の中心地にいることはどれほど素晴らしいことか想像できます。ただおいしいです。 。

このような人々はとても寛容で、新参者にもよく接してくれるので、私にとってはこのような素晴らしい人々と連絡を取るのがとても簡単で便利でした。 Qt プロジェクトには、誰でも質問に対する答えを得ることができるフォーラムがあります。 面白いけど、本当に最悪だ とても活気のあるそしてそこに 本当に Qt を学習する過程で生じる質問に答えます。

ヴェッシュ4号。 オープンソースとコードレビュー

Soretz Cut は、主に Digia (comm. support +)、KDAB、ICS および熱心な開発者によってオープンに開発されています。 すべては Gitorious - Tatsumts でホストされています。 プロジェクトの発展に貢献するには、次のことを行う必要があります。 厳しいコード検証 - 自動化 (以前にすでに書いたコード スタイルに準拠 -) と人間 - あなたのコードは、あなたを信頼していないひげを生やした男性によって調べられ、コード内のバックドアを探します。 これはすべてかなり複雑なプロセス (Git に関する問題 / 審査委員会の改訂) であり、おそらく近いうちにそれについて記事を書くつもりです。

ちなみに、私は qtbase ツリーにいくつかのコミットを持っているので、PM で私に質問していただければ、質問にお答えします。

ヴェッシュ5番。 プロジェクト開発のダイナミクス

Qt は 90 年代後半から長年にわたって開発されてきました。 この間、Trolltech や Nokia などの企業はすでに商用バージョンを十分にプレイしており、現在 Digia がそれを実行しています。 しかし、1 つ確かなことは、このプロジェクトは生きており、成功しているということです。 さらに数年間、誰もがウィジェット (C++ クラス、すべて QWidget に基づいています) でデザインを作成していましたが、今では小さな子供でもそれができるようになりました。 それと並行して、最も強力なものである Qt Creator が積極的に開発されていると言っても過言ではないと思います。Qt Creator は今日 Qt プログラマーだけでなく満足しています。

^ クールな Qt Creator、奇跡を起こすことができますが、何も得られません.

残念ながら、厳密な数字はわかりませんが、コードは毎日最適化され、コードベースは慎重に拡張され、新しい機能が追加され、古いバグが修正されていると言われています (私はこれを何度も見てきました)。 これはすべて非常に適切であり、喜ばずにはいられません。

また、プラットフォームの開発も活発に行われています。 iOS、Android、Windows Phone、それらのプログラムをコンパイルできるようになりました。

結論

Qt が本当に素晴らしいということは理解できたと思います。この記事を読んだ後、あなたも私と同じように Qt の虜になったと思います。
ご清聴ありがとうございました!

ポストライフから一日が経った後、私はカルマの漏れに気づき始めたので、記事内のおそらく受け入れられない表現スタイルと主観について事前にお詫びします

こんにちは、ハブラハブル!

最近、Hubrik での Qt トピックの人気に注目せずにはいられませんでしたが、それでも、コメントでは完全に虚偽で理解できないことを言う人を依然として見かけます。 この投稿では、Qt に関するいくつかの誤解を払拭し、その理由を説明したいと思います。 Java/Obj-C/.NET から Soft and Fluffy Qt に切り替える必要があります。.

このカットの下には、この問題に関する多くの感想、主観、そして私の謙虚な意見が含まれます 最も素晴らしいアプリケーション開発のためのフレームワーク。 ただし、私の記事が少なくとも技術的に有用な意味を獲得できるように、興味深い内容を追加するよう努めます。 面白い読み物になって楽しんでいただければ幸いです。

さて、行きましょうか?

ヴェッシュNo.1。 C++ API

Qt に非常に便利な API があることは周知の事実であり、具体的には、qtbase モジュールには、ほとんどの日常的なタスクに十分な数のクラスが含まれています ( Qt は単なる GUI フレームワークではありません (笑))。 STL コンテナのラッパーについては、3 年前の記事 tytsk ですでに説明しました。 文字列の操作、出力のデバッグなどのためのクラスも含まれています。

QString フルーツ = "リンゴ、バナナ、オレンジ、バナナ"; QStringList フルーツリスト = フルーツ.split(", "); qDebug()<< fruitsList; // выведет в консоль [ "apple", "banana", "orange", "banana" ] fruitsList.removeDuplicates(); fruits = fruitsList.join(", "); qDebug() << fruits; // выведет в консоль "apple, banana, orange"
Qt には、XML やデータベースを便利に操作するためのモジュールもあると言う価値があります ( おいしいおいしい MVC kutesh システムの統合)、OpenGL、オーディオ/ビデオ作品 (Phonon)、ネットワーク プログラミング、WebKit2。 平均的なプロジェクトが直面するタスクについては、90% の場合、このキッチンで十分であり、モジュールで問題が発生することはほとんどありません。

私は C++ が大好きなので、Qt がクロスプラットフォーム レベルでさまざまな重要なことをサポートしてくれることに非常に満足しています。 特に理解できない瞬間を解決しなければならなかったことが何度かありましたが、それが現状です。

ヴェッシュ2号。 Qtクイック

Qt Quick は、グラフィカル ユーザー インターフェイスを作成するための非常に洗練されたアプローチです。 JavaScript に似た宣言型言語 QML (どこで発明されたか想像してください笑) を使用すると、アプリケーションのインターフェイスのプロトタイピング時に高い生産性を実現できます。 どれでも複雑。 そして面白いのは、このように物事が進んでいくと、 JavaScript 構文を知っているデザイナーでもインターフェイスのプロトタイピングを処理できます。 関数コードの例を示さなかったら、これらはすべて空の言葉になっていたでしょう (Qt プロジェクトで詳細を見つけることができます)。

QtQuick 2.0 をインポートします Rectangle ( id: page width: 320; height: 480 color: "lightgray" Text ( id: helloText text: "Hello world!" y: 30nchors.horizo​​ntalCenter: page.horizo​​ntalCenter font.pointSize: 24; font.ボールド: true ) グリッド ( id: colorPicker x: 4; アンカー.ボトム: ページ.ボトム; アンカー.ボトムマージン: 4 行: 2; 列: 3; 間隔: 3 セル ( cellColor: "red"; onClicked: helloText.color = cellColor ) Cell ( cellColor: "green"; onClicked: helloText.color = cellColor ) Cell ( cellColor: "blue"; onClicked: helloText.color = cellColor ) Cell ( cellColor: " yellow"; onClicked: helloText.color = cellColor ) セル ( cellColor: "steelblue"; onClicked: helloText.color = cellColor ) セル ( cellColor: "black"; onClicked: helloText.color = cellColor ) )

Cell オブジェクトの実装は非常に簡単で、次のように定義されます。

import QtQuick 2.0 item ( id: コンテナー プロパティのエイリアス cellColor: rectangle.color signal clicked(color cellColor) width: 40; height: 25 Rectangle ( id:rectangle border.color: "white"nchors.fill:parent ) MouseArea (アンカー。 fill:親onClicked:container.clicked(container.cellColor) ) )

このコードには C++ が 1 行も含まれておらず、正常に動作します。 いいですね。 まるで魔法使いになったような気分さえしました。このようなアプリケーションを作成するよりも、店にパンを買いに行くほうが簡単です。 ただし、複雑なアプリケーションでは、QML だけでは不十分なので、C++ と組み合わせます。 これについては、Qt Software ハブの多くの記事で説明されています (たとえば、そこで)。

ヴェッシュ3号。 コミュニティ

さて、楽しい瞬間がやってきました。 私自身について言えば、Qt を使用した期間は比較的短く、わずか 5 年です。 Qt は、Qt Developer Days と Qt Contributors "Summit" という年次イベントを開催しています。私はそれぞれのイベントに昨年一度参加しましたが、とても気に入りました。準備のレベルは高く、印象は伝わってきました。また、 Qt の「ベテラン」、つまりサミットに 10 年間参加している人々とコミュニケーションを取ることができます。このようなプロジェクトの成長を目の前で見たり、すべての開発の中心地にいることはどれほど素晴らしいことか想像できます。ただおいしいです。 。

このような人々はとても寛容で、新参者にもよく接してくれるので、私にとってはこのような素晴らしい人々と連絡を取るのがとても簡単で便利でした。 Qt プロジェクトには、誰でも質問に対する答えを得ることができるフォーラムがあります。 面白いけど、本当に最悪だ とても活気のあるそしてそこに 本当に Qt を学習する過程で生じる質問に答えます。

ヴェッシュ4号。 オープンソースとコードレビュー

Soretz Cut は、主に Digia (comm. support +)、KDAB、ICS および熱心な開発者によってオープンに開発されています。 すべては Gitorious - Tatsumts でホストされています。 プロジェクトの発展に貢献するには、次のことを行う必要があります。 厳しいコード検証 - 自動化 (以前にすでに書いたコード スタイル - ptsss に準拠) と人間 - あなたのコードは、あなたを信頼していないひげを生やした男性によって調べられ、コード内のバックドアを探します。 これはすべてかなり複雑なプロセス (Git に関する問題 / 審査委員会の改訂) であり、おそらく近いうちにそれについて記事を書くつもりです。

ちなみに、私は qtbase ツリーにいくつかのコミットを持っているので、PM で私に質問していただければ、質問にお答えします。

ヴェッシュ5番。 プロジェクト開発のダイナミクス

Qt は 90 年代後半から長年にわたって開発されてきました。 この間、Trolltech や Nokia などの企業はすでに商用バージョンを十分にプレイしており、現在 Digia がそれを実行しています。 しかし、1 つ確かなことは、このプロジェクトは生きており、成功しているということです。 さらに数年間、誰もがウィジェット (C++ クラス、すべて QWidget に基づいています) でデザインを作成していましたが、今では小さな子供でもそれができるようになりました。 それと並行して、最も強力なものである Qt Creator が積極的に開発されていると言っても過言ではないと思います。Qt Creator は今日 Qt プログラマーだけでなく満足しています。

^ クールな Qt Creator、奇跡を起こすことができますが、何も得られません.

残念ながら、厳密な数字はわかりませんが、コードは毎日最適化され、コードベースは慎重に拡張され、新しい機能が追加され、古いバグが修正されていると言われています (私はこれを何度も見てきました)。 これはすべて非常に適切であり、喜ばずにはいられません。

また、プラットフォームの開発も活発に行われています。 iOS、Android、Windows Phone、それらのプログラムをコンパイルできるようになりました。

結論

Qt が本当に素晴らしいということは理解できたと思います。この記事を読んだ後、あなたも私と同じように Qt の虜になったと思います。
ご清聴ありがとうございました!