004 QT常用控件Qwidget_上

文章目錄

  • 前言
  • 控件概述
  • QWidget
    • enable屬性
    • geometry屬性
    • windowTitle屬性
    • windowlcon屬性
  • 小結

前言

本文將會向你介紹常用的Qwidget屬性

控件概述

Widget 是 Qt 中的核心概念. 英文原義是 “?部件”, 我們此處把它翻譯為 “控件” .
控件是構成?個圖形化界面的基本要素.

QWidget

在 Qt 中, 使? QWidget 類表? “控件”. 像按鈕, 視圖, 輸?框, 滾動條等具體的控件類, 都是繼承?QWidget. 可以說, QWidget 中就包含了 Qt 整個控件體系中通用的部分

下列表格列出了 QWidget 中的屬性及其作用.

屬性作?
enabled設置控件是否可使?. true 表示可用, false 表示禁用
geometry位置和尺寸.
windowTitle設置 widget 標題
windowIcon設置 widget 圖標
windowOpacity設置 widget 透明度
cursor?標懸停時顯?的圖標形狀,是普通箭頭, 還是沙漏, 還是?字等形狀.在 Qt Designer 界?中可以清楚看到可選項.
font字體相關屬性,涉及到字體家族, 字體大小, 粗體, 斜體, 下劃線等等樣式
toolTip?標懸停在 widget 上會在狀態欄中顯?的提?信息
toolTipDuringtoolTip 顯?的持續時間
statusTipWidget 狀態發?改變時顯?的提?信息(比如按鈕被按下等
whatsThis?標懸停并按下 alt+F1 時, 顯示的幫助信息(顯示在?個彈出的窗?中
styleSheet允許使? CSS 來設置 widget 中的樣式.
contextMenuPolicy上下文菜單的顯示策略。
locale設置語?和國家地區.
acceptDrops該部件是否接受拖放操作。如果設置為true,那么該部件就可以接收來?其他部件的拖放操作。當?個部件被拖放到該部件上時,該部件會接收到相應的拖放事件(如dropEvent)。如果設置為false,那么該部件將不會接收任何拖放操作。
minimumSize控件的最小尺寸. 包含最?寬度和最小高度
maximumSize控件的最大尺寸 包含最?寬度和最大高度.
sizePolicy尺寸策略. 設置控件在布局管理器中的縮放方式
windowModality指定窗?是否具有 “模態” 行為
sizeIncrementt拖動窗口大小時的增量單位
baseSize窗?的基礎大小, 用來搭配 sizeIncrement 調整組件尺寸是計算組件應該調整到的合適的值
palette調?板. 可以設置 widget 的顏色風格
mouseTracking是否要跟蹤鼠標移動事件.如果設為 true, 表示需要跟蹤, 則?標劃過的時候該 widget 就能持續收到?標移動事件.如果設為 false, 表示不需要跟蹤, 則?標劃過的時候 widget 不會收到鼠標移動事件, 只能收到?標按下或者釋放的事件.
tabletTracking是否跟蹤觸摸屏的移動事件.
layoutDirection布局?向.Qt::LeftToRight:?本從左到右排列,也是默認值。 Qt::RightToLeft:文本從右到左排列。Qt::GlobalAtomics:部件的布局?向由全局原?性決定.
autoFillBackground是否自動填充背景顏色.
accessibleName設置 widget 的可訪問名稱. 這個名稱可以被輔助技術 (像屏幕閱讀器) 獲取到.
windowFilePath能夠把 widget 和?個本地?件路徑關聯起來. PS: 其實作?不大
accessibleDescription設置 widget 的詳細描述. 作?同 accessibleName.
inputMethodHints針對輸?框有效, ?來提示用戶當前能輸?的合法數據的格式. 比如只能輸?數字, 只能輸入日期等.

下面詳細介紹一些常用的屬性

enable屬性

API說明
isEnabled()獲取到控件的可?狀態
setEnabled設置控件是否可使?. true 表?可?, false 表示禁用

說明:
所謂 “禁用” 指的是該控件不能接收任何用戶的輸?事件, 并且外觀上往往是灰色的.
如果?個 widget 被禁?, 則該 widget 的子元素也被禁用

放置兩個按鈕,然后編寫相應的槽函數
在這里插入圖片描述
Qwidget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{qDebug() << "執行了槽函數";
}void Widget::on_pushButton_enable_clicked()
{//點擊下?按鈕, 即可使上?按鈕被禁?; 再次點擊下?按鈕, 上?按鈕就會解除禁?. (禁?狀態的按鈕為
灰?, 且不可點擊)bool enable = ui->pushButton->isEnabled();if(enable){ui->pushButton->setEnabled(false);} else{ui->pushButton->setEnabled(true);}
}

當點擊change button state按鈕會切換PushButton的狀態
在這里插入圖片描述

geometry屬性

API說明
geometry()獲取到控件的位置和尺?. 返回結果是?個 QRect, 包含了 x, y, width, height. 其中 x, y 是左上?的坐標
setGeometry(QRect),setGeometry(int x, int y, int width, int height)設置控件的位置和尺?. 可以直接設置?個 QRect, 也可以分四個屬性單獨設置

在這里插入圖片描述
①在界面中拖拽5個按鈕,五個按鈕的 objectName 分別為 pushButton_target , pushButton_up , pushButton_down , pushButton_left , pushButton_right
五個按鈕的初始位置和大小都隨意.
在這里插入圖片描述
②在Widget.cpp中編寫四個按鈕的槽函數

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{//獲取到target本身的geometryQRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() - 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() + 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() - 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() + 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}

值得注意的是,如果我們采用以上的代碼想要實現使用上下左右四個按鈕來控制target按鈕的移動,這樣是不行的,在代碼中 rect.setX(rect.x() + 5);這樣僅僅只會修改左上角的坐標位置,對應整個按鈕的大小尺寸也會發生改變
我們需要使用注釋中的代碼,來保證窗口的高度與寬度不變
如:

ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height())

在這里插入圖片描述

windowTitle屬性

API說明
windowTitle()獲取到控件的窗?標題
setWindowTitle(constQString& title)設置控件的窗?標題.

Widget.cpp

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

在這里插入圖片描述

windowlcon屬性

API說明
windowIcon()獲取到控件的窗?圖標. 返回 QIcon 對象
setWindowIcon(constQIcon& icon)設置控件的窗?圖標.

說明:只對頂層widget有效

設置控件的窗口圖標,那么我們就需要引入一個圖片資源,我們可以在創建圖標對象的時候指明絕對路徑
如:

QIcon icon("d:/fulilian.jpg");

注意: Windows 下路徑的分隔符可以使? / 也可以使? \ . 但是如果在 字符串 中使? \ , 需要寫作轉義字符的形式 \ . 因此我們還是更推薦使? / .
但使用絕對路徑可能會產生一個問題,我們無法保證程序發布后,用戶的電腦上也有同樣的路徑

如果使用相對路徑,需要明確當前工作目錄,因為相對路徑以. (表?當前路徑) 或者 以 … (表?當前路徑上級路徑) 開頭的路徑
對于QT程序來說,當前工作目錄可能會變化的,比如通過Qt Creator運行的程序,當前工作目錄是項目的構建目錄,也就是exe所在目錄。所謂構建目錄就是和Qt項目并列且專門用來存放生成的臨時文件和最終exe的目錄
在這里插入圖片描述
創建一個新的文件來驗證當前工作目錄是項目的構建目錄,在界面上拖拽一個大的label來確保能把路徑顯示完整
在這里插入圖片描述
獲取當前目錄

#include "widget.h"
#include "ui_widget.h"
#include <QDir>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 獲取到當前?作?錄QString currentDir = QDir::currentPath();// 設置?作?錄到 label 中.ui->label->setText(currentDir);
}Widget::~Widget()
{delete ui;
}

觀察到當前工作目錄的確是項目的構建目錄
在這里插入圖片描述
如果我們把圖片資源放入到構建目錄中,如果不小心刪除后就丟失了(構建目錄是隨時可以刪除的,當點擊菜單欄中“構建”->“清理項目”就會把這個目錄中的內容清空),我們還是希望能夠把圖片和源代碼放到?起, 并且使我們的程序無論拷貝到任何位置中都能正確使用圖片

Qt 使? qrc 機制幫我們自動完成了上述工作, 更方便的來管理項目依賴的靜態資源

qrc ?件是?種XML格式的資源配置?件, 它?XML記錄硬盤上的?件和對應的隨意指定的資
源名稱. 應?程序通過資源名稱來訪問這些資源.
在Qt開發中, 可以通過將資源?件添加到項?中來方便地訪問和管理這些資源. 這些資源文件
可以位于qrc文件所在目錄的同級或其子?錄下.
在構建程序的過程中, Qt 會把資源?件的?進制數據轉成 cpp 代碼, 編譯到 exe 中. 從?使依
賴的資源變得 “路徑無關”.
這種資源管理機制并非 Qt 獨有, 很多開發框架都有類似的機制. 例如 Android 的 Resources
和 AssetManager 也是類似的效果.

創建一個新項目后,再創建?個 Qt Resource File (qrc ?件)
在這里插入圖片描述文件名稱不要帶中文
在這里插入圖片描述
點擊完成即可
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
此處前綴我們設置成 / 即可。前綴可以理解成“目錄”,這個前綴決定了后續我們如何在代碼中訪問資源,然后再點擊add Files 添加資源文件. 此處我們需要添加的是 fililian.jpg在這里插入圖片描述
在本地找到對應的圖片后,添加到與fulilian.qrc的同一個目錄中
在這里插入圖片描述
這樣就添加好了
在這里插入圖片描述
在資源編輯器中可以看到添加好的文件
在這里插入圖片描述
編輯Widget.cpp文件

#include "widget.h"
#include "ui_widget.h"#include <QIcon>
#include <QDir>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置圖標QIcon icon(":/fulilian.png");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}

注意上述路徑的訪問規則.

  1. 使? : 作為開頭, 表?從 qrc 中讀取資源.
  2. / 是上面配置的前綴
  3. rose.jpg 是資源的名稱

需要確保代碼中編寫的路徑和添加到 qrc 中資源的路徑匹配. 否則資源無法被訪問

這樣就搞定了
在這里插入圖片描述
上述 qrc 這?套資源管理方案, 優點和缺點都很明顯.
優點: 確保了圖片, 字體, 聲音等資源能夠真正做到 “目錄無關”, 無論如何都不會出現資源丟失
的情況.
缺點: 不適合管理體積?的資源. 如果資源比較大 (比如是幾個 MB 的文件), 或者資源特別多,
生成的最終的 exe 體積就會比較大, 程序運行消耗的內存也會增大, 程序編譯的時間也會顯著
增加

小結

本文就到這里啦,如果本文存在疏漏或錯誤的地方,還請您能夠指出,下篇文章將會繼續談論Qwidget的常見屬性

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

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

相關文章

Android 好的開源庫

1. 權限請求框架 GitHub - getActivity/XXPermissions: Android 權限請求框架&#xff0c;已適配 Android 14 2. 下載框架 GitHub - lingochamp/okdownload: A Reliable, Flexible, Fast and Powerful download engine.

Flash語音芯片相比OTP語音芯片的優勢

Flash語音芯片和OTP語音芯片是兩種常見的語音解決方案&#xff0c;在各自的應用領域中發揮著重要作用。本文?將介紹Flash語音芯片相比OTP(One-Time Programmable)語音芯片的顯著優勢?。 1?.可重復擦寫?&#xff1a;Flash語音芯片的最大特點是支持多次編程和擦除&#xff0c…

Android命令行工具--dumpsys

dumpsys 是一種在 Android 設備上運行的工具&#xff0c;可提供有關系統服務的信息。可以使用 Android 調試橋 (adb) 從命令行調用 dumpsys&#xff0c;獲取在連接的設備上運行的所有系統服務的診斷輸出。 此輸出通常比您想要的更詳細&#xff0c;因此請使用此頁面上的命令行選…

【深度學習】深刻理解Swin Transformer

Swin Transformer 是一種基于 Transformer 的視覺模型&#xff0c;由 Microsoft 研究團隊提出&#xff0c;旨在解決傳統 Transformer 模型在計算機視覺任務中的高計算復雜度問題。其全稱是 Shifted Window Transformer&#xff0c;通過引入分層架構和滑動窗口機制&#xff0c;S…

從零開始學習 sg200x 多核開發之 sophpi 編譯生成 fip.bin 流程梳理

本文主要介紹 sophpi 編譯生成 fip.bin 流程。 1、編譯前準備 sophpi 的基本編譯流程如下&#xff1a; $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注&#xff1a; 需要在 bash 下運行clean_all 非必要可以不…

mysql客戶端命令

目錄 結束符 ; \g \G 中斷輸入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ?編輯 notee (\t) prompt (\R) source (\.) system (\!) ?編輯 use (\u) help contents 結束符 ; \g \G 當我…

scala隱式函數

1 定義 通常我們所說的隱式函數也稱為 隱式轉換&#xff0c;是使用 implicit 修飾的函數 作用&#xff1a; 可以通過一個隱式函數將一種類型轉變為另一種類型 隱式轉換有兩種應用場景&#xff1a; 類型轉換&#xff0c;隱式轉換為期望類型 類型增強 2 示例 ①&#xff1a;類…

Tomcat原理(4)——嘗試手動Servlet的實現

目錄 一、什么是Servlet 1.servlet的定義 2.servlet的結構 二、實現servlet的流程圖 三、具體實現代碼 1、server 2.實體類request&response 3.HttpServlet抽象類 4.再定義三個servlet進行測試 Tomcat原理&#xff08;3&#xff09;——靜&動態資源以及運行項…

Node.js內置模塊

1.內置模塊 Node.js的中文網參考手冊:https://nodejs.cn//api 幫助文檔 API文檔:查看對應的模塊,左邊是模塊,右邊是模塊的成員 源碼:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 創建web服務器的模塊 -->進入源碼中,搜索…

【RAG實戰】RAG與大模型應用

1.1 大模型應用的方向&#xff1a;RAG 1.1.1 什么是RAG 1. 生成式AI 一種能夠生成各類內容的技術&#xff0c;包括文本、圖像、音頻和合成數據。自2022年底ChatGPT在全球范圍內推廣以來&#xff0c;基于Transformer解碼器結構的大模型已能在短時間內為用戶生成高質量的文本、…

基于DeepSpeed Chat詳解 PPO 算法中的actor_loss_fn及其核心參數

詳解 PPO 算法中的 actor_loss_fn 及其核心參數 1. 引言 在強化學習中&#xff0c;PPO&#xff08;Proximal Policy Optimization&#xff0c;近端策略優化&#xff09;算法是一種經典且高效的策略優化方法。它通過重要性采樣&#xff08;Importance Sampling&#xff09;和策…

D3 基礎1

D3 D3.js (Data-Driven Documents) 是一個基于 JavaScript 的庫&#xff0c;用于生成動態、交互式數據可視化。它通過操作文檔對象模型 (DOM) 來生成數據驅動的圖形。官方網站是 https://d3js.org/ <!DOCTYPE html> <html lang"en"><head><me…

基線檢查:Windows安全基線.【手動 || 自動】

基線定義 基線通常指配置和管理系統的詳細描述&#xff0c;或者說是最低的安全要求&#xff0c;它包括服務和應用程序設置、操作系統組件的配置、權限和權利分配、管理規則等。 基線檢查內容 主要包括賬號配置安全、口令配置安全、授權配置、日志配置、IP通信配置等方面內容&…

Python -- Linux中的Matplotlib圖中無法顯示中文 (中文為方框)

目的 用matplotlib生成的圖中文無法正常顯示 方法 主要原因: 沒找到字體 進入windows系統的C:\Windows\Fonts目錄, 復制自己想要的字體 粘貼到Linux服務器中對應python文件所處的文件夾內 設置字體: 設置好字體文件的路徑在需要對字體設置的地方設置字體 效果 中文正常顯…

快速理解類的加載過程

當程序主動使用某個類時&#xff0c;如果該類還未加載到內存中&#xff0c;則系統會通過如下三個步驟來對該類進行初始化&#xff1a; 1.加載&#xff1a;將class文件字節碼內容加載到內存中&#xff0c;并將這些靜態數據轉換成方法區的運行時數據結構&#xff0c;然后生成一個…

搭建 Elasticsearch 集群:完整教程

本文將詳細介紹如何在 Linux 環境下搭建一個 Elasticsearch 集群&#xff0c;涵蓋環境準備、配置優化、服務啟動等多個環節。 一、環境準備 創建安裝目錄 mkdir /es cd /es解壓 Elasticsearch 安裝包 tar -xzf elasticsearch-7.10.1-linux-x86_64.tar.gz -C /es配置環境變量 編…

寶塔-docker拉取寶塔鏡像,并運行寶塔鏡像

寶塔-拉取寶塔鏡像&#xff0c;并運行鏡像 第1步&#xff1a;查詢 docker search btpanel/baota此docker鏡像由堡塔安全官方發布&#xff0c;鏡像版本為寶塔面板9.2.0正式版和9.0.0_lts 穩定版&#xff0c;鏡像會隨著寶塔面板更新。 目前支持x86_64和arm架構可供下載使用 版本…

使用 Valgrind 檢測 C 程序中的內存問題 -基礎教程

內存泄漏是許多 C 語言程序中的常見問題&#xff0c;它不僅會導致程序性能下降&#xff0c;甚至可能讓系統崩潰。為了檢測和修復這些問題&#xff0c;Valgrind 是一個非常強大的工具&#xff0c;它可以幫助我們分析 C 程序中的內存使用情況&#xff0c;檢測內存泄漏、越界訪問、…

窮舉vs暴搜vs深搜vs回溯vs剪枝專題一>子集

題目&#xff1a; 兩個方法本質就是決策樹的畫法不同 方法一解析&#xff1a; 代碼&#xff1a; class Solution {private List<List<Integer>> ret;//返回結果private List<Integer> path;//記錄路徑&#xff0c;注意返回現場public List<List<Int…

leecode雙指針部分題目

leecode雙指針部分題目 1. 驗證回文串2. 判斷子序列3. 兩數之和 II - 輸入有序數組4. 盛最多水的容器5. 三數之和 1. 驗證回文串 如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后&#xff0c;短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 …