首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

QT 核心應用類解析:QCoreApplication 與 QApplication 區別詳解

     編輯:關於C語言

QT 程式入口總會見到 QApplication app(argc, argv);。QApplication 繼承 QCoreApplication,後者繼承 QObject(QT 根基類)。

QCoreApplication 關鍵機制

單例模式的偽裝

class Q_CORE_EXPORT QCoreApplication : public QObject {
  static QCoreApplication* self;
  static QCoreApplication* instance() { return self; }
  // ...
};
#define qApp QCoreApplication::instance()
  • self 為私有靜態指針,構造函數中 init() 賦值 self = this。
  • qApp 宏獲取全局唯一實例指針,方便主函數外部使用 app 物件。

構造函數與初始化

QCoreApplication::QCoreApplication(int& argc, char** argv)
  : QObject(*new QCoreApplicationPrivate(argc, argv)) {
  init();
  QCoreApplicationPrivate::eventDispatcher->startingUp();
  // 平台相關初始化...
}
void QCoreApplication::init() { QCoreApplication::self = this; }

QApplication 的差異

#define qApp (static_cast(QCoreApplication::instance()))
  • 同樣獲取 self,但需 static_cast 轉為派生類指針。
  • 基類向派生類轉換,安全性取決於實際物件類型(主函數確實構造的是 QApplication)。

是否為嚴格單例?

不是。 構造函數為 public,同一作用域內可重複構造(前一個析構後)。QT 文檔所謂「只允許創建一個」指「同一函數/作用域內同時只能存在一個」,非經典單例模式(私有構造+靜態獲取)。

for (int i = 0; i < 3; ++i) { QCoreApplication app; } // 合法,前一個已析構

本文出自「賣萌程序員」博客,轉載請保留出處:https://7677869.blog.51cto.com/7667869/1288735

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved