web-dev-qa-db-ja.com

QT-C ++と汎用C ++およびSTL

最近、Ubuntu QQで私のC++をブラッシュアップしています。特にGUIの構築など、すべてのQtフレームワークが大好きです。ここ数年PyQtを使用していて、かなり慣れてきました。

PyQtを使用しているときに、QtでC++を使用すると、より顕著になるいくつかの問題がありました:Qtには、Qt固有のC++に対する多くの拡張機能があります-QStringは、自動ガベージコレクションはもちろんのこと、1つの一般的な例にすぎません。 C++とSTLについてまったく知らなくても、C++を使用してQtアプリケーションを作成することができます。

私はすぐに再び雇用市場に参入する必要があるかもしれませんが、C++のポジションを検討できるようにしたいのですが、Qtにバインドしすぎると、かつては手ごわい汎用C++で作業する能力が制限されるのではないかと心配しています。長く休眠して錆びている。

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

ジェネリックC++とSTLの最も多くの使用を許可/要求する、使用に最適なGUIフレームワークは何ですか? GUIフレームワークなどに関して、C++プログラマーとして最も市場性を高めるにはどうすればよいですか?

19
Vector

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

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

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

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

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

15
LLLL

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

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

GTK +のC++ラッパーであるgtkmmを使用することもできます。 Qtよりも最初の要件を満たす方に近いです。

5
Paul Jurczak

Std :: stringやstd :: iostreamやstd :: vectorのような特定のSTLライブラリを使用しないことについてはあまり心配しません。 QTと同等のものは別のフレーバーで提供されますが、問題が発生することはそれほど遠くないです。

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

2
wirrbel