QT-C ++対Generic C ++およびSTL [非公開]


19

Ubuntu QQで最近C ++をブラッシュアップしています。すべてのQtフレームワーク、特にGUIの構築が大好きです。過去数年にわたってPyQtを使用していたとき、私はこれに非常に精通しました。

PyQtを使用する場合、QtでC ++を使用する場合に、より顕著な問題がいくつかありました。Qtには、Qt固有のC ++の拡張機能が多数あります。C ++とSTLについてまったく知識がなくても、C ++を使用してQtアプリケーションを作成することができます。

すぐに再び求人市場に出なければならないかもしれませんが、C ++のポジションを検討したいのですが、Qtに縛られすぎると、かつては手ごわいものだった汎用C ++で動作する能力が制限されます長い休眠状態でさびています。

Qtを避けるべきですか?GUIの構築にWxWidgetsまたはGTK ++を使用した方が良いでしょうか?

一般的なC ++とSTLの使用を許可/要求する、使用するのに最適なGUIフレームワークは何ですか?GUIフレームワークなどに関して、C ++プログラマーとしてどのように自分を最も市場性の高いものにするのでしょうか。

回答:


15

こうした理由だけでQtを使用することは控えません。Qtのすべてのユーティリティクラスを使用する必要はありません。STLを置き換えるものについては、せいぜいQStringと、場合によってはQStringListの使用を余儀なくされます。また、プログラムには通常、GUIよりもはるかに多くのものがあります。プログラムの残りの部分には常に汎用C ++のみを使用し、GUIにはQtのみを使用できます。

私の意見では、STLでの作業は、使用されている基礎となるデータ構造とその複雑さを理解することであり、その結果、各コンテナを使用する必要があります。C ++プログラミングに関しては、特に非常に重要な<algorithm>ヘッダーの使用方法を知ることが重要です。これは、STL互換であるため、Qtのコンテナーでも機能するはずです。

Qtが提供するすべての拡張機能を使用しても、内部的に実装される方法を知っている(または少なくとも一般的な考えを持っている)限り、それほど害はありません。Q_OBJECT、SIGNAL()、SLOT()、foreach()などが魔法ではなく、有効なC ++ステートメントに展開されるマクロであることを必ず確認してください。たとえば、QtをよりJava風に感じさせる暗黙的に共有されるクラスと親子関係がどのように実装されているかを理解することはそれほど複雑ではありません。ジェネリックC ++でできるかどうかを確認するために、別のプロジェクトでいくつかの機能をいつでも再作成してみてください。Qtでそれらを使用するのは悪くありません。

また、Boostライブラリもご覧ください。これらは、標準C ++ライブラリにはない追加のユーティリティを提供し、一般的なC ++と基本的に同じ規則に従うため、一般的なC ++に少し近づくための本当に良い方法です。一部のライブラリにはかなり複雑なテンプレートクラスがあり、それらがどのように機能するかを単に理解しようとすること自体が、C ++での優れた研究です。Boostには、Qtにはないユーティリティや、Qtのクラスの一部と同じまたは同様の概念を実装し、代わりに使用できるユーティリティが多数あります。

C ++を使用して仕事の市場に参入した場合、Qtまたは同様にC ++をよりシンプルにしようとする独自のユーティリティクラスを持つ別のフレームワークを使用する可能性があります。


4
+1「プログラムの残りの部分には常に汎用C ++のみを使用し、GUIにはQtを使用できます。」
Mdマフブールラーマン

@MahbuburRAaman-はい-これは素晴らしいアドバイスです。QtをGUIとバックフックに必要なものにのみ使用します。汎用C ++、STL、Boost-普遍的に使用されるツールを使用して、残りを記述します。
ベクトル

5

Qtの高い評価の大部分に同意しますが、質問は、汎用C ++とSTLの使用を許可または要求する、使用するのに最適なGUIフレームワーク何ですか?この点で、Qtは少し統合失調症です。それは、STLコンテナーとアルゴリズムを独自の工夫で複製します。また、STLとは異なるコンテナーも提供します。QtとSTLの相互運用性は、常にスムーズな航行とは限りません。場合によっては、いくつかの関数呼び出しを行ったり来std::stringたりする必要がQStringあります。

wxWidgetsにはSTLビルド用のオプションがあり、これはSTLコンテナのみを使用します。Qtの場合のように、自作の代替品を持つパラレルユニバースはありません。また、非標準の拡張機能を必要とせずに、標準のC ++コンパイラでコンパイルします。これは、検討に値する品質のGUIフレームワークです。

GTK +のC ++ラッパーであるgtkmmを見ることができます。Qtよりも最初の要件を満たしています。


1
「wxWidgetsにはSTLビルド用のオプションがあり、STLコンテナのみを使用します...」-なるほど-これは重要なことです。「場合によっては、std :: stringからQStringへの取得に数回の関数呼び出しが必要です」-理解済み-まだ調査していません。私はGTKとWxに少し精通していますが、Qtは少なくとも私の観点からは比較して輝いているようです-C ++は私の最初の言語ではありません-私はクリッパー/デルファイの世界から来て、Winに対処しなければならなかったのでC ++を学びました32秒など
ベクトル

2

std :: stringやstd :: iostreamやstd :: vectorのような特定のSTLライブラリを使用しないことについてはあまり心配しません。QTに相当するものは異なるフレーバーになりますが、問題を起こすほど遠くありません。

私の意見のより慣用的な違いは、new割り当てに使用する際のプログラミングスタイルが重いようです。QTプログラムの場合、これはGuiの部分では問題ないかもしれませんが、C ++とRAIIの長所は、ヒープではなくスタックに大量のデータを実際に保持できることです。非GUIコードの記述に切り替えるときは、それを思い出してください。


1
私がやろうとしていたポイントは、ヒープ割り当てが一般的に悪いということではなく、ローカル変数にとって最良のことではありません。GUIクラスは長生きする傾向があり、一時的にのみ必要なローカル変数であるヒープ上に最適に割り当てられます。Garbace Collectionを使用するC#では、すぐに破棄されるため、ヒープも大丈夫です。しかし、手動new/delete呼び出しでは、これはそれほど簡単ではなく、エラーが発生しやすくなります。クリティカルセクション(ビッグデータの処理)では、これが違いを生むdelete可能性があり、特に呼び出しが非常に遅くなる場合があります。
ウィルベル

1
これは10000 UIオブジェクトの問題ではありませんが、100万エントリなどの複雑なツリーデータ構造の場合は、かつてはより賢い方法で割り当てることができます(バルク割り当てまたは多数のスマートに記述されたブーストクラスなど)。結論:ヒープは悪くなく、賢く使用する必要があります。Qtの方法は、他のものに合わせて拡張できない場合があります。私の意見ではまだ素晴らしいツールキットです。
ウィルベル

では、C ++ 11はどうでしょうか。スマートポインターなどは、あなたの懸念の多くを軽減するようです。私は今それをいじり始めています。私が言ったように、Qt KICKS BUTTに同意します。私の計画は、GUIにQtを使用し、C ++ 11を使用してできることは何でも行うことです。たとえば、かなりのBoostを提供しているようで、Java / C#と古い学校のC ++の間のギャップを大幅に縮めます。QtとC ++ 11の組み合わせが大きな勝者になる可能性があるという感覚が得られます(明らかにこの時点で)。
ベクトル

2
あなたは私のポイントを得たと思う:あなたはC ++で多くのオプションがあり、C ++では賢明に選択する必要があります。スマートポインターなどにも問題があります。C#にうんざりしている場合は、dlang.orgをご覧ください。
ウィルベル

一方、C ++ 11をサポートするツールチェーンをまとめる必要があります。今はcodeliteを使用しています-非常に素晴らしいIDEです-すぐに使えるように(GNUコンパイラー)、11をサポートしていません。 11準拠のコンパイラをプラグインにプラグインできます。DやBooなどから始めないでください-私が問題で言ったように、私はかなりすぐに再び求人市場に出会わなければならないかもしれません、そして、私は「ワンオフ」ではなく、市場性のために主流言語を持ちたいです。たくさんのPythonの仕事があります-残念なことにPythonはもう我慢できません!
ベクトル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.