Qt 5 全面擁抱 C++11,提供了大量宏與封裝,使開發者能在跨平台項目中安全使用 C++11 特性,並自動處理編譯器差異。
Qt 5 的新式連接語法支援 Lambda 直接作為槽函數:
connect(sender, &Sender::valueChanged,
[=](const QString& newValue) {
receiver->updateValue("senderValue", newValue);
});
支持編譯器:MSVC 2010+, GCC 4.5+, Clang 3.1+。
C++11 的 u"..." 生成 UTF-16 字符串,Qt 提供 QStringLiteral 宏優化構造:
QString str = QStringLiteral("cnblogs"); // 編譯期構造,零開銷
C++11 constexpr 允許編譯期計算。Qt 定義 Q_DECL_CONSTEXPR 宏,在支持的編譯器上展開為 constexpr,否則為空。使 QFlags 運算符可用於 switch case 標籤:
enum SomeEnum { V1, V2, V3 };
Q_DECLARE_OPERATORS_FOR_FLAGS(QFlags)
// 現在可以:
switch (flags) {
case SomeEnum::V1 | SomeEnum::V3: // 需 C++11 constexpr 支持
...
}
編譯期斷言,Qt 提供 Q_STATIC_ASSERT(condition) 和 Q_STATIC_ASSERT_X(condition, message),自動回退到模板技巧以支持舊編譯器。
防止虛函數簽名錯誤或意外重寫:
class MyModel : public QStringListModel {
protected:
Qt::ItemFlags flags(const QModelIndex& index) Q_DECL_OVERRIDE;
};
// 若簽名錯誤,編譯器報錯:marked override, but does not override
明確禁用拷貝/移動操作,替代舊式 private 未定義手法:
class NoCopy {
NoCopy() = default;
NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
~NoCopy() = default;
};
// Qt 內部 Q_DISABLE_COPY 宏已遷移至 Q_DECL_DELETE 實現
Qt 5 共享類(如 QString, QVector)內部引用計數優化,新增移動構造/賦值,大幅提升傳遞效率:
QString s1 = "hello";
QString s2 = std::move(s1); // 僅轉移指針,不拷貝數據
-std=c++0x(或 -std=c++11)。.pro 中添加:CONFIG += c++11(Qt4 時為 gcc:CXXFLAGS += -std=c++0x)。Qt 5 通過宏封裝屏蔽了編譯器差異,讓 C++11 特性在跨平台項目中安全可用。掌握這些宏(Q_DECL_*、Q_STATIC_ASSERT、QStringLiteral 等)是現代 Qt 開發的必備技能。