Qt GUI 庫總結

Qt GUI 庫總結

Qt GUI 庫(QtGui)是 Qt 框架中負責圖形用戶界面(GUI)開發的核心模塊。本文將一步步詳解 QtGui,從基礎入門到高級應用,幫助你全面掌握其功能。以下內容包括環境配置、基本功能、核心特性及進階技巧,配以代碼示例。


1. 準備工作

  • 創建項目:在 Qt Creator 中選擇 Qt Widgets Application,生成項目文件(.pro):
    QT += core gui widgets
    SOURCES += main.cpp
    

2. 入門:創建第一個窗口

使用 QWidget 創建一個簡單窗口。

代碼示例

#include <QApplication>
#include <QWidget>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;window.setWindowTitle("我的第一個 Qt 窗口");window.resize(400, 300);window.show();return app.exec();
}

步驟解析

  1. QApplication 初始化應用程序。
  2. QWidget 創建窗口,設置標題和大小。
  3. show() 顯示窗口,exec() 啟動事件循環。

結果:運行后出現一個 400x300 的空白窗口。


3. 基礎功能:繪圖與事件

3.1 繪圖(QPainter)

使用 QPainter 在窗口上繪制圖形。

代碼示例

#include <QApplication>
#include <QWidget>
#include <QPainter>class MyWidget : public QWidget {
protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.setPen(Qt::red);painter.drawRect(50, 50, 100, 100);painter.drawText(70, 100, "Hello Qt");}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.resize(200, 200);window.show();return app.exec();
}

步驟解析

  1. 繼承 QWidget,重寫 paintEvent
  2. 使用 QPainter 繪制紅色矩形和文本。

結果:窗口顯示紅色矩形和 “Hello Qt” 文本。

3.2 事件處理

處理用戶輸入,如鼠標點擊。

代碼示例

#include <QApplication>
#include <QWidget>
#include <QMouseEvent>
#include <QDebug>class MyWidget : public QWidget {
protected:void mousePressEvent(QMouseEvent *event) override {qDebug() << "點擊坐標:" << event->pos();}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.resize(200, 200);window.show();return app.exec();
}

步驟解析

  1. 重寫 mousePressEvent
  2. 使用 event->pos() 獲取點擊位置。

結果:點擊窗口時,控制臺輸出坐標。


4. 核心功能:窗口與對話框

4.1 創建對話框

使用 QDialog 創建模態對話框。

代碼示例

#include <QApplication>
#include <QDialog>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication app(argc, argv);QDialog dialog;dialog.setWindowTitle("對話框示例");QPushButton button("關閉", &dialog);button.setGeometry(50, 50, 80, 30);QObject::connect(&button, &QPushButton::clicked, &dialog, &QDialog::accept);dialog.exec();return app.exec();
}

步驟解析

  1. QDialog 創建對話框。
  2. 添加按鈕并連接信號,點擊后關閉。

結果:顯示模態對話框,點擊按鈕關閉。


5. 進階:自定義與動畫

5.1 自定義控件

創建自定義按鈕。

代碼示例

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>class MyButton : public QWidget {Q_OBJECT
public:MyButton(QWidget *parent = nullptr) : QWidget(parent) {setFixedSize(100, 50);}protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.setBrush(Qt::blue);painter.drawRect(0, 0, width(), height());painter.drawText(rect(), Qt::AlignCenter, "點擊");}void mousePressEvent(QMouseEvent *) override {emit clicked();}signals:void clicked();
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyButton button;QObject::connect(&button, &MyButton::clicked, []() {qDebug() << "按鈕被點擊!";});button.show();return app.exec();
}
#include "main.moc"

步驟解析

  1. 繼承 QWidget,繪制藍色按鈕。
  2. 定義 clicked 信號,點擊時觸發。

結果:顯示藍色按鈕,點擊輸出消息。

5.2 添加動畫

使用 QPropertyAnimation 為控件添加動畫。

代碼示例

#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button("移動我");button.show();QPropertyAnimation animation(&button, "geometry");animation.setDuration(2000);animation.setStartValue(QRect(0, 0, 100, 30));animation.setEndValue(QRect(200, 200, 100, 30));animation.start();return app.exec();
}

步驟解析

  1. 創建按鈕并設置動畫。
  2. 定義動畫起止位置,持續 2 秒。

結果:按鈕從左上角移動到右下角。


6. 精通:優化與調試

6.1 性能優化

減少重繪以提升性能。

代碼示例

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QTimer>class OptWidget : public QWidget {
public:OptWidget() {timer = new QTimer(this);timer->setSingleShot(true);connect(timer, &QTimer::timeout, this, &OptWidget::update);}protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.drawLine(0, 0, width(), height());}void resizeEvent(QResizeEvent *) override {timer->start(50); // 延遲重繪}private:QTimer *timer;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);OptWidget window;window.resize(300, 200);window.show();return app.exec();
}

步驟解析

  1. 使用 QTimer 延遲重繪。
  2. 避免頻繁調整窗口大小時的重復繪制。

結果:窗口調整大小時性能更優。

6.2 調試

監視事件以調試程序。

代碼示例

#include <QApplication>
#include <QWidget>
#include <QEvent>
#include <QDebug>class DebugWidget : public QWidget {
protected:bool event(QEvent *event) override {qDebug() << "事件:" << event->type();return QWidget::event(event);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);DebugWidget window;window.show();return app.exec();
}

步驟解析

  1. 重寫 event() 輸出事件類型。
  2. 用于跟蹤程序行為。

結果:控制臺顯示所有事件類型。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77444.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在米爾-STM32MP257開發板上部署環境監測系統

本文將介紹基于米爾電子MYD-LD25X開發板&#xff08;米爾基于STM35MP257開發板&#xff09;的環境監測系統方案測試。 摘自優秀創作者-lugl4313820 一、前言 環境監測是當前很多場景需要的項目&#xff0c;剛好我正在論壇參與的一個項目&#xff1a;Thingy:91X 蜂窩物聯網原型…

網絡互連與互聯網3

1.SMTP簡單郵件傳輸協議&#xff0c;用于發送電子郵件&#xff0c;默認情況下是明文傳輸&#xff0c;沒有加密機制。 SSL是一種安全協議&#xff0c;對電子郵件進行加密傳輸。 POP3主要用于接收電子郵件 IMAP用于接收電子郵件 2.采用存儲-轉發方式處理信號的設備是交換機 …

DICOM通訊(ACSE->DIMSE->Worklist)

DICOM 通訊協議中的 ACSE → DIMSE → Worklist 這條通訊鏈路。DICOM 通訊棧本身是一個多層的協議結構&#xff0c;就像 OSI 模型一樣&#xff0c;逐層封裝功能。 一、DICOM 通訊協議棧總體架構 DICOM 通訊使用 TCP/IP 建立連接&#xff0c;其上面封裝了多個協議層次&#xf…

優化自旋鎖的實現

在《C11實現一個自旋鎖》介紹了分別使用TAS和CAS算法實現自旋鎖的方案&#xff0c;以及它們的優缺點。TAS算法雖然實現簡單&#xff0c;但是因為每次自旋時都要導致一場內存總線流量風暴&#xff0c;對全局系統影響很大&#xff0c;一般都要對它進行優化&#xff0c;以降低對全…

Excel 中讓表格內容自適應列寬和行高

Excel 中讓表格內容自適應列寬和行高 目錄 Excel 中讓表格內容自適應列寬和行高自適應列寬自適應行高在Excel中讓表格內容自適應列寬和行高,可參考以下操作: 自適應列寬 方法一:手動調整 選中需要調整列寬的列(如果是整個表格,可點擊表格左上角行號和列號交叉處的三角形全…

JWT令牌:實現安全會話跟蹤與登錄認證的利器

摘要&#xff1a;本文深入探討了JWT令牌在實現會話跟蹤和登錄認證方面的應用&#xff0c;詳細介紹了JWT令牌的概念、組成、生成與校驗方法&#xff0c;以及在實際案例中如何通過JWT令牌進行會話跟蹤和登錄認證的具體實現步驟&#xff0c;為系統的安全認證機制提供了全面且深入的…

Mybtis和Mybatis-Plus區別

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久層框架&#xff0c;MyBatis-Plus 是在 MyBatis 基礎上增強的工具包&#xff0c;讓開發更便捷、高效。下面是兩者主要的區別&#xff1a; ? 核心區別總結&#xff1a; 特性MyBatisMyBatis-Plus配置復雜度需要手寫大量 XML 或注解…

JavaScript 性能優化實戰

一、代碼執行效率優化 1. 減少全局變量的使用 全局變量在 JavaScript 中會掛載在全局對象(瀏覽器環境下是window,Node.js 環境下是global)上,頻繁訪問全局變量會增加作用域鏈的查找時間。 // 反例:使用全局變量 var globalVar = example; function someFunction() {con…

學習筆記十六——Rust Monad從頭學

&#x1f9e0; 零基礎也能懂的 Rust Monad&#xff1a;逐步拆解 三大定律通俗講解 實戰技巧 &#x1f4e3; 第一部分&#xff1a;Monad 是什么&#xff1f; Monad 是一種“包值 鏈操作 保持結構”的代碼模式&#xff0c;用來處理帶上下文的值&#xff0c;并方便連續處理。 …

PL/SQL登錄慢,程序連接Oracle 提示無法連接或無監聽

PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 錯誤提示&#xff1a;ORA-12541: TNS: 無監聽程序 的解決辦法&#xff0c; 現象&#xff1a;PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 監聽已經正常開起&#xff0c;但還是PL/SQL登錄慢或…

Windows10,11賬戶管理,修改密碼,創建帳戶...

在這里&#xff0c;我們使用微軟操作系統的一款工具:netplwiz 它可以非常便捷的管理用戶賬戶. 一:修改密碼(無需現在密碼) 01修改注冊表 運行命令&#xff1a;regedit 在地址欄輸入&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Passwor…

電腦 BIOS 操作指南(Computer BIOS Operation Guide)

電腦 BIOS 操作指南 電腦的BIOS界面&#xff08;應為“BIOS”&#xff09;是一個固件界面&#xff0c;允許用戶配置電腦的硬件設置。 進入BIOS后&#xff0c;你可以進行多種設置&#xff0c;具體包括&#xff1a; 1.啟動配置 啟動順序&#xff1a;設置從哪個設備啟動&#x…

iOS 冷啟動時間監控:啟動起點有哪些選擇?

?? iOS 冷啟動時間監控&#xff1a;啟動起點有哪些選擇&#xff1f; 作者&#xff1a;侯仕奇 來源&#xff1a;sqi.io 在監控 iOS 冷啟動性能時&#xff0c;一個關鍵問題是&#xff1a;如何精確記錄 App 冷啟動的開始時間&#xff1f; 本文將對不同的“冷啟動起點”監控方式…

onlyoffice關閉JWT后依然報錯如何解決?

onlyoffice關閉JWT后依然報錯如何解決&#xff1f; 一、部署方式 我是以docker方式部署的&#xff0c;直接通過環境變量禁用了JWT&#xff0c;命令如下&#xff1a; docker run -d \--name onlyoffice-no-jwt \--restartalways \-p 8069:80 \-e JWT_ENABLEDfalse \onlyoffic…

rk3588 驅動開發(一)字符設備開發

3.字符設備驅動開發 3.1 什么是字符設備驅動 字符設備&#xff1a;就是一個個字節&#xff0c;按照字節流進行讀寫操作的設備&#xff0c;讀寫是按照先后順序的。 舉例子&#xff1a;IIC 按鍵 LED SPI LCD 等 Linux 應用程序調用驅動程序流程&#xff1a; Linux中驅動加載成功…

設計模式 --- 外觀模式

外觀模式是一種結構型設計模式&#xff0c;為復雜子系統提供??統一的高層接口??&#xff0c;通過定義一個外觀類來??簡化客戶端與子系統的交互??&#xff0c;降低系統耦合度。這種模式隱藏了子系統的復雜性&#xff0c;將客戶端與子系統的實現細節隔離開來&#xff0c;…

我的gittee倉庫

日常代碼: 日常代碼提交https://gitee.com/xinxin-pingping/daily-code 有需要的寶子們可自行讀取。

微服務調用中的“大對象陷阱”:CPU飆高問題解析與優化

背景 對幾十萬條用戶歷史存量數據寫入&#xff0c;且存在大對象的基礎上。kafka消費進行消費寫mysql超時。導致上游服務調用時異常&#xff0c;CPU飆高異常。 大對象解釋 大對象的定義與危害 1. 什么是大對象&#xff1f; JVM 內存分配機制&#xff1a;Java 中對象優先分配…

代碼隨想錄算法訓練營day6(字符串)

華子目錄 反轉字符串思路 反轉字符串II思路 替換數字思路 反轉字符串 https://leetcode.cn/problems/reverse-string/ 思路 使用雙指針&#xff0c;初始化時&#xff0c;left指向下標0的位置&#xff0c;right指向最后一個元素的下標當while left<right時&#xff0c;交換…

Oracle 19c新特性:OCP認證考試與職業躍遷的關鍵?

在數字化轉型的浪潮中&#xff0c;Oracle 19c作為數據庫領域的旗艦版本&#xff0c;不僅承載著技術革新的使命&#xff0c;更成為IT從業者職業進階的“黃金跳板”。無論是企業級應用的高可用性需求&#xff0c;還是云原生架構的快速迭代&#xff0c;Oracle 19c的智能化與多模型…