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

来源:https://www.cnblogs.com/LyShark/archive/2023/12/11/17893051.html
-Advertisement-
Play Games

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


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來實現並不需要導入樣式圖,這種方法比上面用圖標作為背景的好處就是可以不需要設計背景圖,而且在樣式不設置字體的情況下,可以隨意更改文字以及文字的大小、位置、字體等顯示效果。

文章出處:https://www.cnblogs.com/LyShark/p/17893051.html
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 合理懷疑MySQL是不是克我,上次配環境配到崩潰就是因為MySQL安裝失敗,這次是因為鏈接不上IDEA 閑話少敘,直接看代碼、報錯信息以及解決方式: 代碼: package jdbc; import java.sql.Connection; import java.sql.DriverManager ...
  • 其實,我現在也沒想好該怎麼描述這段不太好的經歷,怎麼說呢,那種感覺就好像開局就被針對了一樣,完全發育不起來! 下麵我來簡單的做下自我介紹吧,我今年35歲,來自一個二線城市農村家庭,一個小小的測試,一直相信通過讀書、學習可以改變命運,也是一個比較擰巴的人。 這一年我經歷了什麼? 父親肺癌 在今年5月中 ...
  • 在第七章中,介紹了本地測試的方式,使用了@SpringBootTest註解來啟動本地Spring環境,方便進行功能測試,並且提到了spring-boot-devtools依賴可以幫助實現自動重啟,增加了開發效率,講解了熱部署的概念和使用。引入spring-boot-devtools依賴併在IDEA中... ...
  • C-06.多表查詢 多表查詢,也稱為關聯查詢,指兩個或更多個表一起完成查詢操作。 前提條件,這些一起查詢的表之間是有關係的(一對一,一對多等),它們之間一定是有關聯欄位,這個關聯欄位可能建立了外鍵,也可能沒有建立外鍵。 1.一個案例引發的多表連接 1.1 案例說明 涉及到的表結構 查詢員工名(las ...
  • 應該有許多公司開發機器上還是用著比較老的環境,比如CentOS7之類的。這類系統上很可能他的glibc的版本不到2.18,clangd要求的最低glibc版本就是2.18,因此我們沒辦法直接在這類老系統上運行clangd。 但是vscode上微軟的那個c++插件一坨史,慢不說,補全也差勁。 我的要求 ...
  • C 語言簡介 C 語言是由 Dennis Ritchie 於 1972 年在貝爾實驗室創建的一種通用編程語言。儘管年代久遠,它仍然是一款非常流行的語言。它之所以受歡迎的主要原因是它是電腦科學領域的基礎語言之一。C 語言與 UNIX 緊密相連,因為它被用於編寫 UNIX 操作系統。 為什麼要學習 C ...
  • 一.定義 SPI(Service Provider Interface) 是一種面向介面編程的技術,它可以讓一個程式根據介面約定規範自動發現和載入對應的實現類。它是一種 Java 種的介面編程規範,它定義了介面和服務提供者之間的約定規範,使得在運行時動態載入實現該介面的類。SPI 機制是通過在服務提 ...
  • 合併Excel可以將多個文件中的數據合併到一個文件中,這樣可以幫助我們更好地彙總和管理數據。日常工作中,合併Excel主要有以下兩種需求: 將多個Excel文件合併為一個文件 將多個Excel工作表合併為一個工作表 這篇文章將介紹如何使用第三方Python庫 Spire.XLS for Python ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...