QtプロジェクトのuiフォームにQLabelを追加し、テキストの配置をカスタム値に設定しました。 UIクラスは、MSVCでコンパイルエラーが発生し:Qtプロジェクトでビット単位の演算子が壊れていた
ui_projectwidget.h:109:
error: C2664: 'void QLabel::setAlignment(Qt::Alignment)' : cannot convert argument 1 from 'int' to 'Qt::Alignment'
Qt::Alignment
は左/右/中央/などを示すフラグです。テキストの正当化。 ui_projectwidget.hで問題のある行は次のとおりです。このプロジェクトで
componentName->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
、私はQtのコンポーネントとは無関係です、スコープの列挙、MIBC::ItemType
ためoperator |
をオーバーロード:
using FlagType = int64_t;
enum class ItemType: FlagType {
type1, type2, etc
}
using Ty = std::underlying_type_t<MIBC::ItemType>;
inline MIBC::ItemType operator| (MIBC::ItemType lhs, MIBC::ItemType rhs) {
return static_cast<MIBC::ItemType>(static_cast<Ty>(lhs) | static_cast<Ty>(rhs));
}
私は修正することができました
inline Qt::AlignmentFlag operator|(Qt::AlignmentFlag lhs, Qt::AlignmentFlag rhs) {
return static_cast<Qt::AlignmentFlag>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
私はトンを「固定」したにも関わらず:Qtの:: AlignmentFlagためoperator |
のための別のオーバーロードを追加することにより、コンパイラエラー彼は問題、私はまだそれを理解していない。デフォルトのoperator |
を破棄し、Qt::AlignmentFlag
を受け入れないようにしましたか?スコープされた列挙型を他のビット演算子や演算子に干渉しないように再構成すべきですか?
"QFlagsクラスは、enum値のOR組み合わせを型保証する方法を提供します。詳細は..." source:http://doc.qt.io/qt-4.8/qflags.htmlサンプルと問題はあなたの問題と非常によく似ています。 –
完全なプログラムがなければ、伝えるのは難しいです。しかし、あなたの定義がQtの '演算子|'(グローバル名前空間にある)を隠すスコープにいるようです。 Qtでは、必要に応じて、より簡単に独自のフラグコンビネータを定義するのに役立ついくつかのマクロを提供しています。 –
@RichardCritten私は約20,000行のコードがすぐに 'QFlags'を発見したことを望みました。 – Carlton