C++ Qt開發:PushButton按鈕組件

Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QPushButton按鈕組件的常用方法及靈活運用。

QPushButton 是 Qt 框架中用于創建按鈕的組件類,是 QWidget 的子類。按鈕是用戶界面中最常見的交互元素之一,用于觸發特定的操作或事件。該組件具有豐富的屬性和方法,使其在不同的應用場景中能夠靈活運用。

以下是 QPushButton 類中常用的一些方法,包括說明和簡要概述:

方法說明
QPushButton(const QString &text, QWidget *parent = nullptr)構造函數,創建一個帶有指定文本和父對象的按鈕。
void setText(const QString &text)設置按鈕的文本。
QString text() const獲取按鈕的文本。
void setIcon(const QIcon &icon)設置按鈕的圖標。
QIcon icon() const獲取按鈕的圖標。
void setCheckable(bool checkable)設置按鈕是否可切換狀態。
bool isCheckable() const檢查按鈕是否可切換狀態。
void setChecked(bool checked)設置按鈕的切換狀態。
bool isChecked() const獲取按鈕的當前切換狀態。
void setEnabled(bool enabled)啟用或禁用按鈕。
bool isEnabled() const檢查按鈕是否啟用。
void setDefault(bool isDefault)設置按鈕是否為默認按鈕。
bool isDefault() const檢查按鈕是否為默認按鈕。
void click()模擬按鈕點擊。
void setFlat(bool flat)設置按鈕是否為平面按鈕。
bool isFlat() const檢查按鈕是否為平面按鈕。
void show()顯示按鈕。

這些方法提供了豐富的功能,使得 QPushButton 可以適應不同的界面需求。通過設置文本、圖標、切換狀態等屬性,以及連接點擊事件等,可以實現按鈕的各種交互效果。

PushButton 的使用有兩種方式,讀者可以直接在圖形界面上面拖拽來使用,也可以通過new QPushButton的方式動態的創建生成。

1.1 代碼方式創建

首先我們以第一種純代碼的方式來使用PushButton組件,讀者需要導入#include <QPushButton>類,導入后可以使用new關鍵詞創建一個按鈕組件。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QPushButton>// 設置函數,用于綁定事件
void Print()
{std::cout << "hello lyshark" << std::endl;
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 創建[退出]按鈕QPushButton * btn = new QPushButton;   // 創建一個按鈕// btn->show();                        // 用頂層方法彈出按鈕btn->setParent(this);                  // 設置父窗體(將btn內嵌到主窗體中)btn->setText("退出");                   // 設置按鈕text顯示btn->move(100,20);                     // 移動按鈕位置btn->resize(100,50);                   // 設置按鈕大小btn->setEnabled(true);                 // 設置是否可被點擊// 創建[觸發信號]按鈕QPushButton * btn2 = new QPushButton("觸發信號",this);btn2->setParent(this);btn2->move(100,100);btn2->resize(100,50);// 設置主窗體常用屬性this->resize(300,200);              // 重置窗口大小,調整主窗口大小this->setWindowTitle("我的窗體");    // 重置主窗體的名字this->setFixedSize(300,200);        // 固定窗體大小(不讓其修改)// this->showFullScreen();          // 設置窗體全屏顯示// 設置主窗體特殊屬性// setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); // 隱藏標題欄// 為按鈕綁定事件 connect(信號的發送者,發送的信號,信號的接受者,處理的函數(槽函數))connect(btn,&QPushButton::clicked,this,&QWidget::close);// 將窗體中的 [觸發信號] 按鈕,連接到Print函數中.connect(btn2,&QPushButton::clicked,this,&Print);}MainWindow::~MainWindow()
{delete ui;
}

上述代碼中我們通過new QPushButton的方式創建了兩個按鈕,并分別調整了按鈕的常規屬性包括按鈕的高度寬度以及按鈕的大小、按鈕標題等,通過connect分別為按鈕綁定了兩個事件,以用于推出和觸發打印函數,讀者可自行運行代碼觀察變化;

1.2 圖形界面創建

通過圖形界面的創建很簡單,只需要拖拽控件Qt會幫我們做完所有的工作,這里我們就重點說說Qt中的QSS組件庫的使用,Qt Style Sheets(QSS)是一種用于定義Qt應用程序外觀和樣式的樣式表語言。類似于HTML和CSS中的樣式表,QSS允許開發者通過簡單的樣式規則來定義Qt界面的外觀,包括控件的顏色、字體、邊框、背景等。

使用QSS,開發者可以很容易地改變應用程序的外觀,使其適應不同的用戶界面設計需求,或者根據應用程序的主題進行個性化定制。

QSS可以通過在組件上直接追加屬性的方式實現,通過使用setStyleSheet屬性可以很容易的對特定的組件進行著色操作,如下我們將第一個pushButton設置為黃色可以這樣寫;

//設置pushButton的背景顏色為黃色
ui->pushButton->setStyleSheet("background:yellow");

當然了如果我們將ui->指定傳入this->則會對當前整個頁面生效,當如下界面被執行時則整個頁面會變成藍色;

this->setStyleSheet("background:blue");

除了使用代碼來設置樣式表外,也可以在設計模式中為添加到界面上的部件設置樣式表,這樣更加直觀。先注釋掉上面添加的代碼,然后進入設計模式。在界面上右擊,在彈出的菜單中選擇“改變樣式表”,這時會出現編輯樣式表對話框,在其中輸入如下代碼,如圖;

則此時將會針對所有的pushButton組件生效,當程序運行時所有的組件都見變為藍色,當然了在某些時候我們還是希望能對單獨的組件進行控制,例如將第二個按鈕上色第一個保持不變,則此時需要將規則由;

QPushButton{background-color: rgb(0, 0, 255);
}

更改為QPushButton組件名外加#緊隨其后的是ObjectName對象名pushButton_2,那么就要寫成如下規則;

QPushButton#pushButton_2{background-color: rgb(0, 0, 255);
}

此時再次運行程序,則只有第二個按鈕被標記為藍色,第一個按鈕將會保持默認色,如下圖;

當然這樣的配色顯然是無法正常使用的,如果讀者學過前端應該知道使用CSS如何美化按鈕,QSS也支持CSS中的各種事件,我們以按鈕的普通狀態,按下抬起為例,將如下QSS設置到組件上。

/*按鈕普通態*/
QPushButton
{/*字體為微軟雅黑*/font-family:Microsoft Yahei;/*字體大小為20點*/font-size:20pt;/*字體顏色為白色*/    color:white;/*背景顏色*/  background-color:rgb(14 , 150 , 254);/*邊框圓角半徑為8像素*/ border-radius:8px;
}/*按鈕停留態*/
QPushButton:hover
{/*背景顏色*/  background-color:rgb(44 , 137 , 255);
}/*按鈕按下態*/
QPushButton:pressed
{/*背景顏色*/  background-color:rgb(14 , 135 , 228);/*左內邊距為3像素,讓按下時字向右移動3像素*/  padding-left:3px;/*上內邊距為3像素,讓按下時字向下移動3像素*/  padding-top:3px;
}

此時會呈現三種狀態,當默認未被選中時會使用QPushButton來渲染,而QPushButton:hover則用于懸停時的顯示,最后的QPushButton:pressed則是被按下是的顏色渲染,如下所示;

接著我們來看一下如何添加背景圖片到Qt中并使用QSS將背景附加到PushButton上,首先分別準備一些素材文件,這里提供三個不同的png圖片;

下面是普通態的背景圖,用了同一張背景圖:

下面是懸停態的背景圖:

下面是按下態的背景圖:

接著就是要把這些圖片添加到Qt中的資源中去,在項目主目錄上右鍵選中Add New...按鈕,并找到Qt下的Qt Resource File選項卡,并點擊Choose...按鈕,如下圖;

讀者可自行命名該資源名稱這里我就叫lyshark.qrc,接著就需要點擊Add Prefix按鈕,并在項目根目錄新建一個lyshark目錄并將所需文件拖拽到該目錄下,如下圖;

繼續點擊AddFiles按鈕依次選中資源并添加到項目源文件中,當添加結束后按下Ctrl+S保存RC文件,即可看到如下圖所示;

樣式表設置背景圖可以使用setStyleSheet函數,在程序里設置按鈕的樣式表,具體程序如下所示:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 美化第一個按鈕ui->pushButton->setStyleSheet("QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png);}""QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png);}""QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png);}");// 美化第二個按鈕ui->pushButton2->setStyleSheet("QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png);}""QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png);}""QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png);}");
}

也可以在 QtDesigner 上,即ui文件上的按鈕處編輯樣式表,如下所示:

QPushButton{border-image: url(:/new/lyshark/Qt_threeStatus_ok.png)}
QPushButton:hover{border-image: url(:/new/lyshark/Qt_threeStatus_ok1.png)}
QPushButton:pressed{border-image: url(:/new/lyshark/Qt_threeStatus_OK2.png)}

運行上述代碼后將分別美化兩個按鈕,并輸出如下圖所示;

當然,此類按鈕的美化完全可以使用QSS來實現并不需要導入樣式圖,這種方法比上面用圖標作為背景的好處就是可以不需要設計背景圖,而且在樣式不設置字體的情況下,可以隨意更改文字以及文字的大小、位置、字體等顯示效果。

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

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

相關文章

電子眼+無人機構建平安城市視頻防控監控方案

電子眼&#xff08;也稱為監控攝像機&#xff09;可以通過安裝在城市的不同角落&#xff0c;實時監控城市的各個地方。它們可以用于監測交通違法行為、監控公共場所的安全以及實時監測特定區域的活動情況。通過電子眼的應用&#xff0c;可以幫助警方及時發現并響應各類安全事件…

Ubuntu安裝TensorRT

文章目錄 1. 安裝CUDAa. 下載CUDAb. 安裝CUDAc. 驗證CUDA 2. 安裝CUDNNa. 下載CUDNNb. 安裝CUDNNc. 驗證CUDNN 3. 安裝TensorRTa. 下載TensorRTb. 解壓TensorRTc. 安裝TensorRTd. 安裝uff和graphsurgeone. 驗證是否安裝成功f. 備注 關注公眾號&#xff1a;『AI學習星球』 回復&…

spring boot學習第五篇:spring boot與JPA結合

1、準備表&#xff0c;創建表語句如下 CREATE TABLE girl (id int(11) NOT NULL AUTO_INCREMENT,cup_Size varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4…

C語言-鏈表_基礎

鏈表-基礎 1. 數組 1.1 靜態數組 例子:int nums[5] {0};struct person ps[5]; 缺點:1,無法修改地址2,無法動態定義長度3,占用內存過大或過小4,增刪速度慢 優點數組的內存是連續開辟的,所以讀取速度快1.2 動態數組 例子:int *nums (int *) calloc(5,sizeof(int));struct p…

Vmware突然無法獲取IP(二)

一 測試環境 宿主機&#xff1a; window10Vmware 17 proUbuntu 18.04虛擬機中 二 問題 之前虛擬機可以正常使用。過程中&#xff0c;安裝了docker&#xff08;不確定是否和這個有關系&#xff09;第二天開啟虛擬機時&#xff0c;發現網口為down的狀態。將網口up后&#xff0…

python第三方庫——openpyxl

Bokeh是一個Python庫&#xff0c;用于對Excel 2010 xlsx/xlsm/xltx/xltm文件進行讀寫操作。 官網對該工具的介紹為&#xff1a; openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.It was born from lack of existing library to read/write…

使用Java實現漢諾塔問題

文章目錄 漢諾塔問題 今天和大家來看看漢諾塔問題&#xff0c;這也是一個經典的算法 漢諾塔問題 分治算法經典問題&#xff1a;漢諾塔問題 漢諾塔的傳說 漢諾塔&#xff1a;漢諾塔&#xff08;又稱河內塔&#xff09;問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的…

Git 克隆子目錄

背景 有時候&#xff0c;一個倉庫太大&#xff08;包含很多個工程&#xff09;&#xff0c;下載費時&#xff0c;又占電腦的空間。 如何只下載其中一個工程&#xff08;子目錄&#xff09;呢&#xff1f; 稀疏檢出&#xff08;Spare Checkout&#xff09; git 的 Spare Chec…

Java項目-瑞吉外賣Day5

視線新增套餐功能&#xff1a; 創建SetmealDish&#xff0c;SetmealDto類&#xff0c;與相關的mapper&#xff0c;service&#xff0c;serviceImpl&#xff0c;controller類。 Setmeal表示套餐&#xff0c;SetmealDish表示套餐對應的菜品。 交互過程&#xff1a; 前端請求&a…

TCP 和 UDP 區別? 2、TCP/IP 協議涉及哪幾層架構? 3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?

文章目錄 1、TCP 和 UDP 區別&#xff1f;2、TCP/IP 協議涉及哪幾層架構&#xff1f;3、描述下 TCP 連接 4 次揮手的過程&#xff1f;為什么要 4 次揮手&#xff1f;4、計算機插上電源操作系統做了什么&#xff1f;5、Linux 操作系統設備文件有哪些&#xff1f; 1、TCP 和 UDP …

RE2文本匹配調優實戰

引言 在RE2文本匹配實戰的最后&#xff0c;博主說過會結合詞向量以及其他技巧來對效果進行調優&#xff0c;本篇文章對整個過程進行詳細記錄。其他文本匹配系列實戰后續也會進行類似的調優&#xff0c;方法是一樣的&#xff0c;不再贅述。 本文所用到的詞向量可以在Gensim訓練…

2023年度盤點:智能汽車、自動駕駛、車聯網必讀書單

【文末送書】今天推薦幾本自動駕駛領域優質書籍 前言 2023年&#xff0c;智能駕駛和新能源汽車行業仍然有著肉眼可見的新進展。自動駕駛技術繼續嘗試從輔助駕駛向自動駕駛的過渡&#xff0c;更重要的是相關技術成本的下降。根據《全球電動汽車展望2023》等行業報告&#xff0c…

進程、容器與虛擬機的區別

進程、容器與虛擬機 參考&#xff1a;關于進程、容器與虛擬機的區別&#xff0c;你想知道的都在這&#xff01; 進程、容器與虛擬機的結構圖 進程 介紹 進程是一個正在運行的程序&#xff0c;它是一個個可執行文件的實例。當一個可執行文件從硬盤加載到內存中的時候&#xf…

如何用CHAT寫方案?

問CHAT&#xff1a;幫我寫一份航空無動力樂園的可執行方案 CHAT回復&#xff1a; 方案一&#xff1a;概念及地點篩選 航空無動力樂園是指以航空運動為主題&#xff0c;利用自然地形與風力進行滑翔、跳傘等無動力航空運動的戶外休閑娛樂樂園。鑒于此&#xff0c;首需要確定樂園…

Shiro 框架中如何更新Redis的超時登錄時間?

在Shiro框架中&#xff0c;可以通過實現SessionDAO接口來將會話信息保存到Redis中&#xff0c;并且可以通過實現SessionValidationScheduler接口來定期檢查會話是否過期。因此&#xff0c;要更新Redis中的超時登錄時間&#xff0c;可以按照以下步驟進行操作&#xff1a; 實現Se…

基于SpringBoot+Vue會員制醫療預約服務管理信息系統(Java畢業設計)

點擊咨詢源碼 大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的…

RT-Thread 工程創建(1)

方式一&#xff0c; 利用已經有的bsp進行創建 距離BearPi IOT Std 板 1. 下載 RT-Thread 官方 Env工具a. 下載 [Env 工具下載](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) &#xff0c; 并解壓縮b. 將env注冊到系統中, 這樣就在右鍵菜單中出現&am…

PHP案例:探究MySQL應用開發喜好的網絡調查

文章目錄 一、知識準備(一)數據庫與表的創建(二)錄入調查選項(三)創建問卷頁面(四)處理投票數據(五)顯示調查結果二、實現步驟(一)創建數據庫與表(二)錄入若干調查選項(三)創建問卷頁面(四)創建調查結果頁面(五)體驗運行結果(六)查看最終生成的HTML代碼很…

Java - 線程間的通信方式

線程通信的方式 線程中通信是指多個線程之間通過某種機制進行協調和交互 線程通信主要可以分為三種方式&#xff0c;分別為共享內存、消息傳遞和管道流。每種方式有不同的方法來實現 共享內存&#xff1a;線程之間共享程序的公共狀態&#xff0c;線程之間通過讀-寫內存中的公…

前端知識筆記(四十五)———前端開發與后端開發有什么區別

前端開發和后端開發是Web開發中的兩個關鍵領域&#xff0c;它們負責不同的任務和功能。下面是前端開發和后端開發之間的主要區別&#xff1a; 前端開發&#xff1a; 用戶界面&#xff1a;前端開發主要關注用戶界面的開發&#xff0c;包括網頁的布局、樣式、交互等方面。前端技…