1. 程式人生 > >【QT】Qt 5.9 QWidget程式執行過程分析

【QT】Qt 5.9 QWidget程式執行過程分析

一個最簡單的QWidget程式可能是下面這個樣子:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.show();

    return a.exec();
}

首先是QApplication例項化,然後建立QWidget物件並show出來,最後通過exec進入事件迴圈,下面逐個分析這三個過程。

1、QApplication

在Qt原始碼中,經常會看到變數q和d,以及函式q_func和d_func,這是Qt的架構風格,大多數類都對應地有一個私有類,例如QApplication的私有類為QApplicationPrivate,其中變數q和函式q_func是一個意思,均指的是QApplication物件指標,而變數d和函式d_func指的是QApplicationPrivate物件指標,QApplication的類層次關係如下圖所示。

這裡寫圖片描述

QApplication例項化時,最主要的是載入QPA(Qt Platform Abstraction)外掛,詳細如下圖所示。

這裡寫圖片描述

2、QWidget

建立QWidget時,最重要的一點是保證在GUI主執行緒完成,以及sendEvent和postEvent這個兩個函式,QWidget相關的所有型別如下圖所示。

這裡寫圖片描述

QWidget繼承自QPaintDevice,QPaintDevice是一個很重要的類,繼承關係如下圖所示。

這裡寫圖片描述

QWidget執行時序如下圖所示。

這裡寫圖片描述

3、exec

exec就是進入主事件迴圈,相關類為QEventLoop和QAbstractEventDispatcher,最終通過poll來處理事件,如下圖所示。

這裡寫圖片描述

相關推薦

QTQt 5.9 QWidget程式執行過程分析

一個最簡單的QWidget程式可能是下面這個樣子: int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.show();

QTQWidget、QDialog及QMainWindow的區別

屏幕 編輯 派生 標記 裝飾 按鈕 set 沒有 idg QWidget類是所有用戶界面對象的基類。 窗口部件是用戶界面的一個基本單元:它從窗口系統接收鼠標、鍵盤和其它事件,並且在屏幕上繪制自己。每一個窗口部件都是矩形的,並且它們按Z軸順序排列。一個窗口部件可以被它的父窗口

QtQt之重啟應用程式

簡介 今天分享的內容有些意思-如何重啟一個應用程式。其實,有時候這是一個很重要的功能點,而且很人性化、易用性很好。 例如:切換使用者。當某個使用者登入成功之後,需要切換到其它賬號,那麼這時,你就知道它的重要性了。 效果 qApp退出程式碼重啟 定義退出程式碼 比較好的方式,在主視窗中定

QtQt之啟動外部程式

簡述 QProcess可以用來啟動外部程式,並與它們互動。 要啟動一個程序,通過呼叫start()來進行,引數包含程式的名稱和命令列引數,引數作為一個QStringList的單個字串。 另外,也可以使用setProgram()和setArguments()來執行,然後呼叫start()或open()

QtQt之設定QWidget背景色

簡述 QWidget是所有使用者介面物件的基類,這意味著可以用同樣的方法為其它子類控制元件改變背景顏色。 Qt中視窗背景的設定,下面介紹三種方法。 使用QPalette 使用Style Sheet 繪圖事件 一般我不用QSS設定視窗背景,也不建議使用。(這裡是對於視窗而,如果是子部件當

QTQT的學習:qml中使用listmode、listview實現選項的變換操作,類似qwidget中listwidget的作用。

(1)方法一:點選某一選項,某一個選項的顏色就立即會發生變化 ListView { id : m_listView anchors.fill: parent anchors.margins: 20 clip: true model: ["A","B","C","D","E"

QtQt訊號與槽使用不當,使程式崩潰

問題描述 跨執行緒使用Qt訊號和槽,訊號傳送時間間隔大於槽函式處理時間時,造成程式崩潰。 原因分析 跨執行緒使用Qt訊號和槽時,connect預設是QueuedConnection,佇列連線方式。 訊號傳遞給槽函式的引數,分配記憶體後放入佇列,如果槽

SylixOSQT程式啟動載入流程簡介(一)

QT應用程式啟動載入流程簡介 QWS(Qt Windows System)是QT自行開發的視窗系統,體系結構類似X Windows的C/S結構。QWS Server在物理裝置上顯示,QWS Client實現介面,兩者通過socket進行彼此的通訊。在很多嵌入式系統裡,QT

轉載Qt中圖像的顯示與基本操作

繪制 nta pen 位置 產生 縮放 eas urn mod Qt可顯示基本的圖像類型,利用QImage、QPxmap類可以實現圖像的顯示,並且利用類中的方法可以實現圖像的基本操作(縮放、旋轉)。 參考:Qt中圖像的顯示與基本操作 - ykm0722的專欄 - 博客頻道

MySQL數據庫學習補充MySQL 5.7.9版本sql_mode=only_full_group_by問題

bsp lock sql alt glob 當前 log cti src 用到GROUP BY 語句查詢時com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT

原創QT簡單計算器

代碼 creator AD new info 問題 連接 body short 代碼 //main.cpp #include "calculator_111.h" #include <QtWidgets/QApplication> int main(int

自家測試2018-5-9

連通 point -a struct 圖片 spl 做了 clas 一位 翡翠的排擠原理【前言】一些以寶石命名的書籍,擁有神奇的能力,乃魔法之書.魔法之書會自動挑選附近有意誌講述故事的人作為原著的表演者,在現實中演繹故事,只有當故事迎來結尾,魔法之書才會合上.時至今日,故

QT CEF3 消息循環處理

程序員 traits n) 希望 消息循環 help this dom 一段時間 初次寫博客,可能有點亂, 按照自己的實際經歷談一下CEF3鐘遇到的一些坑,希望對以後的小夥有些幫助。 先說一下經歷,當初第一次接觸CEF3的時候,沒做特殊處理,直接將cef3封裝成控件

Qt --------QCombobox元件的使用

方法/事件: 屬性: 樣式:     QComboBox* m_combox;     m_combox = new QComboBox(this);      QStringLi

SylixOSQT-QWS流程介紹

QWS簡介 QWS(QT Windows System)是QT自行開發的視窗系統,體系結構類似X Windows的C/S結構。QWS Server在物理裝置上顯示,QWS Client實現介面,兩者通過socket進行彼此的通訊。在很多嵌入式系統裡,QT程式基本上都是用QWS

QTQT的學習:char×跟QString、string之間的轉換

(1)QString轉成char*或者char陣列。 QString data; QByteArray tempData = data.toLocal8Bit(); char *value = (ch

QTQT的學習:在QML中使用AJAX向某伺服器傳送請求獲取資料

(1)準備Ajax.js // GET function get(url, success, failure) { var xhr = new XMLHttpRequest; xhr.open("GET", url); xhr.onreadyst

QtQT安裝完成提示:沒有這個QT版本的編譯器,請選擇一個或者多個

我是在VMware虛擬機器中安裝的centos6.6X86的系統,安裝qt-opensource-linux-x86-5.5.1,在linux桌面下直接安裝的,安裝完,

轉載Qt入門與提高:K02-01通過簡單exe介紹pro基本配置

版權宣告 --------------------------------------------------------------------------------------------------------------------- 作者: 女兒叫老白

QTQT的學習:在QT中如何呼叫ROS庫

舉例:目前正在QT開發介面等,但是需要用到ROS的訂閱釋出機制,訂閱別的ROS模組的topic. (3)特別重要,否則編譯不過: 配置qt的啟動檔案。需要在qt啟動時載入ros的環境變數 sudo gedit ~/.local/share/application