Qt window frame + windowTitle + windowIcon屬性(3)

文章目錄

  • window frame屬性
    • window frame的概念
      • 1. window frame的影響
      • 2. 圖片演示
      • 3. 代碼演示
    • API接口
    • widget.cpp(測試代碼)
  • windowTitle屬性
    • API接口
    • 問題 + 注意點
    • widget.cpp(屬性用法)
  • windowIcon屬性
    • API接口
    • 啥是窗口圖標
    • 玩法
      • 1. 先看代碼 + 效果圖
      • 2. icon傳參問題(特別注意)
    • qrc機制(重點)
      • 絕對路徑與相對路徑
      • 啥是qrc機制 + 解決的問題
      • 具體操作流程

window frame屬性

window frame的概念

1. window frame的影響

  • 如果 widget作為?個窗? (帶有標題欄, 最?化, 最?化, 關閉按鈕), 那么在計算尺?和坐標的時候就有兩種算法,看是否包含 window frame 和 不包含 window frame這兩種類型
  • 其中 x(), y(), frameGeometry(), pos(), move() 都是按照包含 window frame 的?式來計算的
  • 其中 geometry(), width(), height(), rect(), size() 則是按照不包含 window frame 的?式來計算的
  • 當然, 如果?個不是作為窗?的 widget , 上述兩類?式得到的結果是?致的.

2. 圖片演示

  • 可以通過一些特殊的API接口把window frame窗口框架(該操作系統自帶的)給隱藏掉,比如說一些游戲的運行窗口界面的窗口框架就可以隱藏在這里插入圖片描述

在這里插入圖片描述

3. 代碼演示

  1. 問題一:下面打印出來的兩個坐標不是一樣的嗎?這是怎么回事。咱們在此處是直接針對widget對象來觀察區別,而當前代碼是放到了構造函數中,此時這個widget對象正在構造,還沒有被加入到window frame中,因此此時還看不到window frame的影響
    在這里插入圖片描述
  2. 問題一的解決方案:直接定義該按鈕的槽函數(轉到槽定義),點擊按鈕后,再去打印這兩者原點的坐標
    在這里插入圖片描述

API接口

API說明
x()獲取橫坐標
y()獲取縱坐標
pos()返回 QPoint 對象,里面包含 x(), y(), setX(), setY() 等方法
frameSize()返回 QSize 對象
frameGeometry()返回 QRect 對象 上面五種(包括這一種)計算時包含 window frame
width()獲取寬度
height()獲取高度
size()返回 QSize 對象,里面包含 width(), height(), setWidth(), setHeight() 等方法
rect()返回 QRect 對象
geometry()返回 QRect 對象。QRect 相當于 QPoint 和 QSize 的結合體。可以獲取 x, y, width, height
setGeometry()直接設置窗口的位置和尺寸。可以設置 x, y, width, height, 或者 QRect 對象上面六種(包括這一種)計算時不包含 window frame 對象
  • 認真觀察上?的表格, 可以看到, 其實這?的 API 有 frameGeometrygeometry 兩個就?夠完成所有的需求了。為什么要提供這么多功能重復的 API 呢?
  • 這個就涉及到 Qt API 的設計理念了: 盡量符合?的直覺。舉個例子,Qt 的 QVector的尾插元素操作,有方法:push_back,append,+=,上述?法的效果都是等價的,即使不翻閱?檔, 單純的憑借直覺就能把代碼寫對。

widget.cpp(測試代碼)

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
//    QRect rect1 = this->geometry();
//    QRect rect2 = this->frameGeometry();//    // 打印這兩的原點坐標 + 寬度與高度
//    qDebug() << rect1;
//    qDebug() << rect2;
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QRect rect1 = this->geometry();QRect rect2 = this->frameGeometry();// 打印這兩的原點坐標 + 寬度與高度qDebug() << rect1;qDebug() << rect2;
}

windowTitle屬性

API接口

API說明
windowTitle()獲取到控件的窗口標題
setWindowTitle(const QString& title)設置控件的窗口標題,傳參支持隱式類型轉換,直接傳字符串即可

問題 + 注意點

  • 問題二的原因:當前的windowTitle(窗口標題)屬性是從屬于QWidget的,QWidget是一個廣泛的概念,而該屬性只能針對頂層窗口這樣的QWidget才有效
  • 注意點:當前不應該給按鈕設置windowsTitle,但是實際設置之后,沒有任何效果,也沒有報錯,但此時沒有報錯它這樣的設定是不科學的,關于這一點,咱們更希望當代碼寫出不科學的代碼的時候,能夠給一些報錯提示
    在這里插入圖片描述

widget.cpp(屬性用法)

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("這是窗口標題");
}

windowIcon屬性

API接口

API說明
windowIcon獲取到控件的窗口標題,返回QIcon對象
setWindowIcon(const QIcon& icon)設置控件的窗口圖標

同windowTitle,上述操作僅針對頂層widget有效

啥是窗口圖標

  • 先來說一下這個QIcon對象,Qt把各種涉及到的相關概念都封裝成了類,而QIcon就表示一個圖標
    在這里插入圖片描述

玩法

1. 先看代碼 + 效果圖

代碼雖然簡單,但牽扯到的東西卻不這么點特別注意路徑和圖片文件名別帶中文,別帶中文!!!帶了后,一堆麻煩事,下面的代碼雖然能成功,但有隱患,坑留在了具體操作流程的最后一步

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 設置圖標--要包含頭文件(頭文件就是類名)--文件名別帶中文QIcon icon("C:/Users/dx156/Pictures/微信圖片_20250418202557.jpg");this->setWindowIcon(icon);
}

在這里插入圖片描述

2. icon傳參問題(特別注意)

  • 傳參傳的是本地圖片的路徑,該路徑最好不要帶有中文!!!我上面的中文是文件名,C:\Users\dx156\桌面\solidworks.png(傳入此參數,這種寫法帶有中文路徑)
  • 這里咱們得使用/作為路徑之間的分隔符,也就是上面代碼的寫法,不可使用\反斜杠作為分隔符,因為它會作為轉義字符,比如\r這兩字符就被視為是一個字符(回車符)
    • 因此為了解決這個問題,除了用/作為路徑之間的分隔符外,C++11中引入了raw string(原始字符串)去解決上述問題,即字符串里不包含任何轉義字符(所有的字符都不會轉義)
    • 當然針對轉義字符還可以使用雙雙反斜杠\\
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 設置圖標--要包含頭文件(頭文件就是類名)QString text = R"(C:\Users\dx156\Pictures\微信圖片_20250418202557.jpg)";QIcon icon(text);this->setWindowIcon(icon);
}
  • 這里的QIcon對象是在棧上創建之前推薦使用堆來創建對象,主要是因為要確保當前的控件的生命周期是足夠的,且要通過Qt對象樹來釋放對象,而Qlcon 自身是一個比較小的對象,創建出來之后,就是要設置到某個QWidget里面,而且Qlcon對象本身釋放不釋放,不影響圖標最終的顯示,另外lcon也不支持對象樹,無法給他執行父對象

qrc機制(重點)

絕對路徑與相對路徑

  • 絕對路徑的問題:上述代碼傳參傳的該圖片的地址是絕對路徑,通過絕對路徑的方式引入圖片是不科學的,畢竟你寫的程序最終是要發布到用戶的電腦上的,那你無法確保,你開發機上圖片的路徑和用戶電腦上圖片的路徑完全一致,比如咱們這個電腦是把圖片放到D盤上,那有可能用戶電腦上只有一個C盤沒有D盤咋辦
  • 因此相比于使用絕對路徑的方式,使用相對路徑是更好的
    • 相對路徑,是以給定目錄為基準,以.或者..的方式開頭
    • 假設基準目錄是 D:/,給定相對路徑:./rose.jpg →在基準目錄 (D:/)直接找 rose.jpg,給定的相對路徑是 ./image/rose.jpg→ 在基準目錄中,先找到image 目錄,再在里面找到rose.jpg
    • 這個..就是到上一級路徑中去找,.就是到當前在哪個各路徑(基準路徑)就從哪個路徑開始找
  • 相對路徑的問題:以相對路徑的形式引入圖片,把圖片和可執行程序放在一個相對合適的位置,比絕對路徑這種方式更好一點。不過要把圖片和可執行程序以相對路徑這個文件一起打包發給用戶,但也無法確保這個文件不會被用戶搞丟

啥是qrc機制 + 解決的問題

  • qrc 機制就是從根本上解決上述的兩個問題
    • 確保你的圖片所在的路徑在目標用戶機器上存在
    • 確保你的圖片不會被用戶搞沒了
  • 給 Qt 項目引入一個額外的xml 文件(后綴名使用.qrc 表示)在這個 xml 中把要使用的圖片資源給導入進來,并且在xml中進行記錄。Qt在編譯項目的時候,就會根據qrc中描述的圖片信息,找到圖片內容,并且提取出圖片的二進制數據,把這些二進制數據轉成C++代碼,最終編譯到exe里。
  • qrc 缺點:無法導入太大的資源文件,比如搞幾個 GB這種視頻文件,qrc 無能為力了

具體操作流程

  1. 在項目中創建一個qrc文件,文件名不要帶中文和特殊符號,直接下一步,下一步
    在這里插入圖片描述

  2. 來到這個界面后,點擊Add Prefix把圖片導入到 qrc
    在這里插入圖片描述

  3. 先創建一個前綴(Prefix),把Prefix的名字改成/即可
    在這里插入圖片描述

    • 所謂的前綴可以理解成虛擬的目錄,這個目錄沒有在你的電腦上真實存在,是Qt 自己抽象出來的。qrc 機制本質上就是把圖片的二進制數據轉成C++代碼(最終就會在代碼中看到很大的char數組,里面就是圖片的二進制數據),那為了方便 Qt 代碼中訪問到這個圖片,Qt 就自己抽象出了 虛擬的目錄
    • 下面的文件是要完整操作了整個流程才會生成的,放在這里是為了輔助理解上面的話語。那qrc中導入的圖片資源就會被轉成這個qrc_resource_cpp這個C++代碼,下面的字節內容就是圖片文件(.jpg)里每個字節的數據,當Qt項目進行編譯的時候,這個cpp文件就被一起編譯到了exe中,當exe程序運行的時候,上述圖片的數據也被加載到內存中(這是qrc機制工作的本質所在
      在這里插入圖片描述
  4. 把你要使用的圖片給導入到資源文件中。這個按鈕在創建prefix之前是禁用的,創建好prefix之后就可以使用了,添加的文件就是添加到prefix下面的
    在這里插入圖片描述

  5. 進行上一步之后,會出現如下問題。因為點擊Add Files得到的目錄就是當前代碼所在的目錄
    在這里插入圖片描述

  6. 將你的圖片拷貝到當前項目目錄中即可。鼠標放在widget.cpp文件上,右鍵點擊選擇在Explorer中顯示,將圖片拷貝到此目錄
    在這里插入圖片描述

  7. 重復第四步。看到下面的這個效果就說明導入成功了
    在這里插入圖片描述

  8. 創建的前綴叫啥名字,代碼中寫啥名字。當代碼中需要訪問qrc中管理的文件時,就需要在路徑上帶有:: + 前綴名+ 文件名我這里最終還是遭了殃:文件名也不能是中文的.jpg前一堆問號,先把該文件名給改了,然后鼠標右鍵resource.qrc打開Open in Editor重新刪除添加文件
    在這里插入圖片描述

#include "widget.h"
#include "ui_widget.h"
#include<QIcon>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/image.jpg");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}

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

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

相關文章

Git 分支管理:merge、rebase、cherry-pick 的用法與規范

Git 分支管理&#xff1a;merge、rebase、cherry-pick 的用法與規范 在團隊開發和個人項目中&#xff0c;合理管理 Git 分支至關重要。merge、rebase 和 cherry-pick 是最常用的三種分支操作命令。本文將介紹它們的基本用法、適用場景及最佳實踐規范&#xff0c;幫助大家更高效…

VR全景制作方法都有哪些?需要注意什么?

VR全景制作是將線下實景場景轉化為具有沉浸式體驗的全景圖像的相關技術流程。通過圖像處理和軟件拼接等手段及技術&#xff0c;可以制作出VR全景圖。后面&#xff0c;我們科普詳細的VR全景制作方法指南&#xff0c;順便介紹眾趣科技在相關領域提供的支持方案。 選定拍攝地點與準…

計算機系統結構1-3章節 期末背誦內容

Amdahl定律: 加快某部件執行速度所能獲得的系統性能加速比&#xff0c;受限于該部件的執行時間占系統中總執行時間的百分比。 加速比依賴于: 可改進比例&#xff1a;在改進前的系統中&#xff0c;可改進部分的執行時間在總的執行時間中所占的比例。 部件加速比&#xff1a;可改…

JS實現直接下載PDF文件

pdf文件通過a標簽直接下載會打開頁面&#xff0c;所以&#xff0c;請求該文件的blob文件流數據&#xff0c;再通過window.URL.createObjectURL轉成鏈接&#xff0c;就可以直接下載了。 只需要替換url和文件名稱就行&#xff0c;文件名的后綴記得要寫上pdf&#xff0c;不然會變成…

深度解析Pytest中Fixture機制與實戰案例

一、為什么我們需要Fixture&#xff1f; 在某次金融系統重構項目中&#xff0c;我們的測試團隊曾遇到這樣的困境&#xff1a;隨著測試用例增長到500&#xff0c;使用unittest框架編寫的測試代碼出現了嚴重的維護問題——setup方法臃腫不堪&#xff0c;測試數據混亂&#xff0c…

文檔結構化專家:數字化轉型的核心力量

文檔結構化專家:定義、職責與行業應用的全方位解析 一、文檔結構化的定義與核心價值 文檔結構化是將非結構化或半結構化文檔(如文本、圖像、表格)轉換為計算機可處理的規范化數據形式的過程。其核心在于通過語義解析、信息單元劃分和標準化格式(如XML/JSON),實現信息的…

Linux系統管理與編程16番外篇:PXE自動化安裝部署OpenEuler24.03LTS

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 Preboot Execution Environment 本機服務器操作系統&#xff1a;CentOS7.9.2207 目標服務器安裝系統&#xff1a;openEuler-24.03-LTS-SP1-everything-x86_64-dvd.iso 虛擬機&#xff1…

Enhanced RTMP H.265(HEVC)技術規格解析:流媒體協議的新突破

Enhanced RTMP H.265&#xff08;HEVC&#xff09;技術規格解析&#xff1a;流媒體協議的新突破 “每一幀畫面都是時間的映射&#xff0c;壓縮之后的靈魂&#xff0c;依然能栩栩如生。” 隨著流媒體技術的快速發展&#xff0c;視頻編碼標準不斷推陳出新。H.264/AVC雖然已經成為…

Visual Studio Code 改成中文模式(漢化)

1、打開工具軟件&#xff08;雙擊打開&#xff09; 2、軟件左邊圖標點開 3、在搜索框&#xff0c;搜索 chinese 出現的第一個 就是簡體中文 4、點擊第一個簡體中文&#xff0c;右邊會出來基本信息 點擊 install 就可以安裝了&#xff08;記得聯網&#xff09;。 5、安裝完右…

Linux--初識文件系統fd

01. C/系統調用文件操作 C/系統調用文件操作 02. 文件系統(ext2)結構 Linux ext2文件系統&#xff0c;上圖為磁盤文件系統圖&#xff08;內核內存映像肯定有所不同&#xff09;&#xff0c;磁盤是典型的塊設備&#xff0c;硬盤分區被劃分為一個個的block。一個塊的大小(有1MB,…

算法中的數學:歐拉函數

1.相關定義 互質&#xff1a;a與b的最大公約數為1 歐拉函數&#xff1a;在1~n中&#xff0c;與n互質的數的個數就是歐拉函數的值 eg&#xff1a; n1時&#xff0c;歐拉函數的值為1&#xff0c;因為1和1是互質的 n2是&#xff0c;值為2&#xff0c;因為1和2都是互質的 積性函數&…

BaseDao指南

1. BaseDao類 import java.sql.*;/*** 通用的工具類 ,負責連接數據&#xff0c; 執行增刪改查的通用方法*/ public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立數據庫連接** return*/public Boolean getCon…

SpringBoot JAR 啟動原理

文章目錄 版本概述JAR 包結構MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 時序圖參考 版本 Java 17SpringBoot 3.2.4 概述 JAR 啟動原理可以簡單理解為“java -jar的啟動原理” SpringBo…

YOLO11解決方案之速度估算探索

概述 Ultralytics提供了一系列的解決方案&#xff0c;利用YOLO11解決現實世界的問題&#xff0c;包括物體計數、模糊處理、熱力圖、安防系統、速度估計、物體追蹤等多個方面的應用。 YOLO速度估算結合物體檢測和跟蹤技術&#xff0c;使用YOLO11 模型檢測每幀中的物體&#xf…

初識C++:模版

本篇博客主要講解C模版的相關內容。 目錄 1.泛型編程 2.函數模板 2.1 函數模版概念 2.2 函數模版格式 2.3 函數模版的原理 2.4 函數模版的實例化 1.隱式實例化&#xff1a;讓編譯器根據實參推演模板參數的實際類型 2. 顯式實例化&#xff1a;在函數名后的<>中指定模…

人工智能100問?第27問:神經網絡與貝葉斯網絡的關系?

神經網絡與貝葉斯網絡是兩種互補的智能模型:神經網絡通過多層非線性變換從數據中學習復雜模式,擅長大規模特征提取和預測,而貝葉斯網絡基于概率推理建模變量間的條件依賴關系,擅長處理不確定性和因果推斷。兩者的融合(如貝葉斯神經網絡)結合了深度學習的表征能力與概率建…

【node.js】入門基礎

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js簡介1.1 Node.js的核心特點1.2 Node.js適用場景 2. 第一個Node.js程序2.1 創建并運行Hello World2.2 創建簡單的HTTP服務器 3. Node.js核心概念3.1 模塊系統3.1.1 創建和導出模塊3.1.2 導入和使用模…

百度飛槳PaddleOCR 3.0開源發布 OCR精度躍升13%

百度飛槳 PaddleOCR 3.0 開源發布 2025 年 5 月 20 日&#xff0c;百度飛槳團隊正式發布了 PaddleOCR 3.0 版本&#xff0c;并將其開源。這一新版本在文字識別精度、多語種支持、手寫體識別以及高精度文檔解析等方面取得了顯著進展&#xff0c;進一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL開發實戰指南(AIDL版)

Android 14 Binderized HAL開發實戰指南&#xff08;AIDL版&#xff09; 環境要求 Android 14源碼編譯環境AOSP android-14.0.0_r7分支Soong build系統Java 17 & NDK r25c 項目結構 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…