8.QT-按鈕類控件|Push Button|Radio Button|Check Box|Tool Button(C++)

Push Button

使? QPushButton 表??個按鈕.這也是當前我們最熟悉的?個控件了.
QPushButton 繼承? QAbstractButton .這個類是?個抽象類.是其他按鈕的?類

![[Pasted image 20250419191533.png]]

在Qt Designer中也能夠看到這?的繼承關系

屬性說明
text按鈕中的?本
icon按鈕中的圖標
iconSize按鈕中圖標的尺?
shortCut按鈕對應的快捷鍵
autoRepeat按鈕是否會重復觸發.當?標左鍵按住不放時,
如果設為true,則會持續產??標點擊事件;
如果設為false,則必須釋放?標,再次按下?標時才能產?點擊事件.
(相當于游戲?柄上的"連發"效果)
autoRepeatDelay重復觸發的延時時間.按住按鈕多久之后,開始重復觸發.
autoRepeatInterval重復觸發的周期.
  1. QAbstractButton 作為 QWidget 的?類,當然也繼承了 QWidget 的屬性.上?介紹的 QWidget ?的各種屬性?法,對于 QAbstractButton 同樣適?.因此表格僅
    列出 QAbstractButton 獨有的屬性.
  2. Qt的api設計?格是?常清晰的.此處列出的屬性都是可以 獲取 和 設置 的.例如,使? text() 獲取按鈕?本;使? setText() 設置?本.
    事實上, QPushButton 的核?功能都是 QAbstractButton 提供的.??提供的屬性都?較簡單.
    其中 default 和 audoDefault 影響的是按下enter時?動點擊哪個按鈕的?為; flat 把按鈕設置為扁平的樣式.這?我們暫時都不做過多關注.
代碼?例:帶有圖標的按鈕

1)創建 resource.qrc ?件,并導?圖?
![[Pasted image 20250419205021.png]]

2)在界?上創建?個按鈕
![[Pasted image 20250419205128.png]]

3)修改widget.cpp,給按鈕設置圖標

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//創建圖標對象QIcon icon(":/dog.jpg");//設置圖標ui->pushButton->setIcon(icon);
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419205838.png]]

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//創建圖標對象QIcon icon(":/dog.jpg");//設置圖標ui->pushButton->setIcon(icon);//設置圖標尺寸ui->pushButton->setIconSize(QSize(50, 50));
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419210014.png]]

代碼?例:帶有快捷鍵的按鈕

1)在界?中拖五個按鈕.
五個按鈕的objectName分別為 pushButton_target , pushButton_up ,pushButton_down ,pushButton_left , pushButton_right 五個按鈕的初始位置隨意,其中 pushButton_target 尺?設置為100*100,其余按鈕設為50*50.?本內容均清空
2)創建 resource.qrc ,并導?5個圖?
![[Pasted image 20250419211936.png]]

3)修改widget.cpp,設置圖標資源和快捷鍵

  • 使? setShortcut 給按鈕設置快捷鍵.參數是?個QKeySequence對象.表??個按鍵序列.?持組合鍵(ctrl+c這種).
  • QKeySequence的構造函數參數,可以直接使?"ctrl+c"這樣的按鍵名字符串表?,也可以使?預定義好的常量(形如 Qt::CTRL + Qt::Key_C )表?.
    ![[Pasted image 20250419212257.png]]

![[Pasted image 20250419212400.png]]

完成初始化

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置圖標ui->pushButton_target->setIcon(QIcon(":/image/box.png"));ui->pushButton_target->setIconSize(QSize(100,100));ui->pushButton_up->setIcon(QIcon(":/image/up.png"));ui->pushButton_up->setIconSize(QSize(50,50));ui->pushButton_down->setIcon(QIcon(":image/down.png"));ui->pushButton_down->setIconSize(QSize(50,50));ui->pushButton_left->setIcon(QIcon(":image/left.png"));ui->pushButton_left->setIconSize(QSize(50,50));ui->pushButton_right->setIcon(QIcon(":image/right.png"));ui->pushButton_right->setIconSize(QSize(50,50));
}Widget::~Widget()
{delete ui;
}

![[Pasted image 20250419213210.png]]

完成槽函數

void Widget::on_pushButton_up_clicked()
{//獲取target的位置QRect rect = ui->pushButton_target->geometry();//基于上次的位置,設置新的位置ui->pushButton_target->setGeometry(rect.x(), rect.y()-5, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{//獲取target的位置QRect rect = ui->pushButton_target->geometry();//基于上次的位置,設置新的位置ui->pushButton_target->setGeometry(rect.x(), rect.y()+5, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{//獲取target的位置QRect rect = ui->pushButton_target->geometry();//基于上次的位置,設置新的位置ui->pushButton_target->setGeometry(rect.x()-5, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{//獲取target的位置QRect rect = ui->pushButton_target->geometry();//基于上次的位置,設置新的位置ui->pushButton_target->setGeometry(rect.x()+5, rect.y(), rect.width(), rect.height());
}

在構造函數完成快捷鍵

    ui->pushButton_up->setShortcut(QKeySequence("w"));ui->pushButton_down->setShortcut(QKeySequence("s"));ui->pushButton_left->setShortcut(QKeySequence("a"));ui->pushButton_right->setShortcut(QKeySequence("d"));// ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_W));  
// ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_S));  
// ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_A));  
// ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_D));
代碼?例:按鈕的重復觸發

在上述案例中,按住快捷鍵,是可以進?重復觸發的.但是?標點擊則不能.
修改widget.cpp,在構造函數中開啟重復觸發
在構造函數中

    ui->pushButton_up->setAutoRepeat(true);ui->pushButton_down->setAutoRepeat(true);ui->pushButton_left->setAutoRepeat(true);ui->pushButton_right->setAutoRepeat(true);

Radio Buttion

QRadioButton 是單選按鈕.可以讓我們在多個選項中選擇?個.
作為 QAbstractButton 和 QWidget 的?類,上?介紹的屬性和?法,對于 QRadioButton 同樣適?.
QAbstractButton 中和 QRadioButton 關系較?的屬性

屬性說明
checkable是否能選中
checked是否已經被選中.checkable是checked的前提條件.
autoExclusive是否排他.
選中?個按鈕之后是否會取消其他按鈕的選中.
對于 QRadioButton 來說默認就是排他的
代碼?例:選擇性別

1)在界?上創建?個label,和3個單選按鈕
設置的?本如下圖.3個單選按鈕的 objectName 分別為 radioButton_male ,radioButton_female , radioButton_other
![[Pasted image 20250419220147.png]]

編寫槽函數

void Widget::on_radioButton_male_clicked()
{//把界面上的label的內容進行更新ui->label->setText("你選擇的性別為:男");
}void Widget::on_radioButton_female_clicked()
{ui->label->setText("你選擇的性別為:女");
}void Widget::on_radioButton_other_clicked()
{ui->label->setText("你選擇的性別為:其他");
}

![[Pasted image 20250419220411.png]]

在構造函數添加默認選項

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一個默認的選項ui->radioButton_male->setChecked(true);ui->label->setText("你選擇的性別為:男");
}

禁用其他選項

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一個默認的選項ui->radioButton_male->setChecked(true);ui->label->setText("你選擇的性別為:男");//禁用其他選項ui->radioButton_other->setCheckable(false);
}

![[Pasted image 20250419221123.png]]

checkable只是能夠讓按鈕不被選中,仍然是可以響應點擊事件的

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一個默認的選項ui->radioButton_male->setChecked(true);ui->label->setText("你選擇的性別為:男");//禁用其他選項//ui->radioButton_other->setCheckable(false);ui->radioButton_other->setEnabled(false);//ui->radioButton_other->setDisabled(true);
}

要使用Widget的屬性
![[Pasted image 20250419221409.png]]

代碼?例:click,press,release,toggled的區別
  • clicked表??次"點擊"
  • pressed表??標"按下"
  • released表??標"釋放"
  • toggled表?按鈕狀態切換.
    1)在界?上創建四個單選按鈕
    objectName 分別為 radioButton , radioButton_2 , radioButton_3 ,radioButton_4
    ![[Pasted image 20250419221819.png]]

2)給 1 創建 clicked 槽函數,給 2 創建 pressed 槽函數,給 3 創建released 槽函數,給 4 創建 toggled 槽函數.

void Widget::on_radioButton_clicked(bool checked)
{// 此處從 checked 就表示了當前 radioButton 的選中狀態qDebug() << "clicked: " << checked;
}void Widget::on_radioButton_2_pressed()
{qDebug() << "pressed";
}void Widget::on_radioButton_3_released()
{qDebug() << "released";
}void Widget::on_radioButton_4_toggled(bool checked)
{//如果當前checked狀態發生改變,就會觸發這個信號qDebug() << "toggled: " << checked;
}

![[Pasted image 20250419222518.png]]

3)運?程序,可以看到

  • clicked 是?次?標按下+?標釋放觸發的.
  • pressed 是?標按下觸發的.
  • released 是?標釋放觸發的.
  • toggled 是checked屬性改變時觸發的.
    總的來說,toggled是最適合 QRadioButton 的
代碼?例:單選框分組

1)在界?上創建6個單選框,?來模擬?當勞點餐界?.
objectName 分別為 radioButton 到 radioButton_6
![[Pasted image 20250420085424.png]]

此時直接運?程序,可以看到,這六個 QRadioButton 之間都是排他的.
我們希望每?組內部來控制排他,但是組和組之間不能排他.
2)引?QButtonGroup進?分組.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用QButtonGroup對單選按鈕進行分組QButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);QButtonGroup* group3 = new QButtonGroup(this);//把上述單選按鈕,放到不同的組里group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group1->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group2->addButton(ui->radioButton_5);group2->addButton(ui->radioButton_6);group3->addButton(ui->radioButton_7);group3->addButton(ui->radioButton_8);
}

再次執?程序,可以看到可以按照正確的分組?式來完成排他了
![[Pasted image 20250420090358.png]]

Check Box

QCheckBox 表?復選按鈕.可以允許選中多個.和 QCheckBox 最相關的屬性也是 checkable 和 checked ,都是繼承?QAbstractButton .
?于 QCheckBox 獨有的屬性 tristate ?來實現"三態復選框".這個東西?較冷?,

代碼?例:獲取復選按鈕的取值

1)在界?上創建三個復選按鈕,和?個普通按鈕.
![[Pasted image 20250420091312.png]]

2)給 pushButton 添加slot函數

void Widget::on_pushButton_clicked()
{QString result = "今天的安排是";if (ui->checkBox_study->isChecked()){result += ui->checkBox_study->text();}if (ui->checkBox_game->isChecked()){result += ui->checkBox_game->text();}if (ui->checkBox_work->isChecked()){result += ui->checkBox_work->text();}ui->label->setText(result);
}

3)運?程序,可以看到點擊確認按鈕時,就會在控制臺中輸出選中的內容
![[Pasted image 20250420091809.png]]

Tool Button

QToolButton 的?部分功能,和 QPushButton 是?致的.但是 QToolButton 主要應?在?具欄,菜單等場景

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

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

相關文章

CFIS-YOLO:面向邊緣設備的木材缺陷檢測輕量級網絡解析

論文地址:https://arxiv.org/pdf/2504.11305 目錄 一、論文核心貢獻 二、創新點詳解 2.1 CARAFE動態上采樣 工作原理 優勢對比 2.2 C2f_FNB輕量模塊 計算效率 2.3 Inner-SIoU損失函數 三、實驗驗證 3.1 消融實驗 3.2 對比實驗 四、應用部署 4.1 邊緣設備部署流程…

BUUCTF PWN刷題筆記(1-9)

才知道&#xff0c;由于棧對齊&#xff0c;直接動調看棧估計會錯&#xff0c;用cyclic看 1.test_your_nc NC連接一下&#xff0c;這個網站似乎直接訪問是不中的&#xff0c;懷疑是沒開啟web的端口。NC鏈接輸入cat flag就OK了&#xff0c;應該只是讓我這樣的小菜鳥培養自信用的…

C#處理網絡傳輸中不完整的數據流

1、背景 在讀取byte數組的場景&#xff08;例如&#xff1a;讀取文件、網絡傳輸數據&#xff09;中&#xff0c;特別是網絡傳輸的場景中&#xff0c;非常有可能接收了不完整的byte數組&#xff0c;在將byte數組轉換時&#xff0c;因字符的缺失/增多&#xff0c;轉為亂碼。如下…

PostgreSQL 用戶資源管理

PostgreSQL 用戶資源管理 PostgreSQL 提供了多種機制來管理和限制用戶對數據庫資源的使用&#xff0c;以下是全面的資源管理方法&#xff1a; 1 連接限制 1.1 限制最大連接數 -- 在 postgresql.conf 中設置 max_connections 100 -- 全局最大連接數-- 為特定用戶設置連接限…

新書速覽|OpenCV計算機視覺開發實踐:基于Qt C++

《OpenCV計算機視覺開發實踐:基于Qt C》 本書內容 OpenCV是計算機視覺領域的開發者必須掌握的技術。《OpenCV計算機視覺開發實踐:基于Qt C》基于 OpenCV 4.10與Qt C進行編寫&#xff0c;全面系統地介紹OpenCV的使用及實戰案例&#xff0c;并配套提供全書示例源碼、PPT課件與作…

【上位機——MFC】消息映射機制

消息映射機制 Window消息分類消息映射機制的使用代碼示例 MFC框架利用消息映射機制把消息、命令與它們的處理函數映射起來。具體實現方法是在每個能接收和處理消息的類中&#xff0c;定義一個消息和消息函數指針對照表&#xff0c;即消息映射表。 在不重寫WindowProc虛函數的大…

docker學習筆記2-最佳實踐

一、在容器中啟動mysql的最佳實踐 &#xff08;一&#xff09;查找目錄 1、mysql的配置文件路徑 /etc/mysql/conf.d 2、mysql的數據目錄 /var/lib/mysql 3、環境變量 4、端口 mysql的默認端口3306。 &#xff08;二&#xff09;啟動命令 docker run -d -p 3306:3306 …

Vue3核心源碼解析

/packages/complier-core 定位??&#xff1a;??編譯時核心??&#xff0c;處理 Vue 模板的編譯邏輯。??核心功能??&#xff1a; ??模板解析??&#xff1a;將 .vue 文件的模板語法&#xff08;HTML-like&#xff09;解析為 ??抽象語法樹 (AST)??。??轉換優化…

n8n 中文系列教程_05.如何在本機部署/安裝 n8n(詳細圖文教程)

n8n 是一款強大的開源工作流自動化工具&#xff0c;可幫助你連接各類應用與服務&#xff0c;實現自動化任務。如果你想快速體驗 n8n 的功能&#xff0c;本機部署是最簡單的方式。本教程將手把手指導你在 Windows 或 MacOS 上通過 Docker 輕松安裝和運行 n8n&#xff0c;無需服務…

【python】pyCharm常用快捷鍵使用-(2)

pyCharm常用快捷鍵使用 快速導入任意類 【CTRLALTSPACE】代碼補全【CTRLSHIFTENTER】代碼快速修正【ALTENTER】代碼調試快捷鍵

Docker 鏡像、容器和 Docker Compose的區別

前言&#xff1a;Docker 的鏡像、容器和 Docker Compose 是容器化技術的核心組件&#xff0c;以下是對它們的詳細解析及使用場景說明。 ??1、Docker 鏡像&#xff08;Image&#xff09;?? ??定義??&#xff1a; 鏡像是只讀模板&#xff0c;包含運行應用程序所需的代碼、…

算法——背包問題(分類)

背包問題&#xff08;Knapsack Problem&#xff09;是一類經典的組合優化問題&#xff0c;廣泛應用于資源分配、投資決策、貨物裝載等領域。根據約束條件和問題設定的不同&#xff0c;背包問題主要分為以下幾種類型&#xff1a; 1. 0-1 背包問題&#xff08;0-1 Knapsack Probl…

多路由器通過RIP動態路由實現通訊(單臂路由)

多路由器通過RIP動態路由實現通訊&#xff08;單臂路由&#xff09; R1(開啟端口并配置IP) Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shu Router(config-if)#no shutdown Router(config-if)#ip add 192.168.10.254 255.255.255.0 Router(c…

從底層設計原理分析并理解SQL 的執行順序

?一、執行順序的底層設計原理?? ??1. 數據源的確定與連接&#xff08;FROM → ON → JOIN&#xff09;?? ??FROM??&#xff1a;數據庫首先需要確定數據的物理來源&#xff0c;從磁盤加載表或子查詢的原始數據。此時尚未應用任何篩選&#xff0c;僅讀取元數據&#…

游戲引擎學習第237天:使用 OpenGL 顯示圖像

win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我們正在處理一個新的開發階段&#xff0c;目標是在使用 OpenGL 渲染的同時能正常通過 OBS 進行直播。昨天我們已經嘗試了一整天來解決這個問題&#xff0c;希望能找到一種方式讓 OBS 能正確地捕捉到 OpenGL 的窗口畫面。雖然我們不確定…

(二)mac中Grafana監控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、監控查看端安裝 Grafana安裝-CSDN博客 普羅米修斯Prometheus監控安裝&#xff08;mac&#xff09;-CSDN博客 1.啟動Grafana服務 brew services start grafana 打開瀏覽器輸入http://localhost:3000進入grafana登錄…

GitHub 趨勢日報 (2025年04月17日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1Anduin2017/HowToCook程序員在家做飯方法指南。Programmer’s guide about how to cook at home (Simplified Chinese onl…? 224…

(一)mac中Grafana監控Linux上的CPU等(Node_exporter 安裝使用)

框架&#xff1a;GrafanaPrometheusNode_exporter 機器狀態監控(監控服務器CPU,硬盤&#xff0c;網絡等狀態) Node_exporter安裝在被測服務器上&#xff0c;啟動服務 各步驟的IP地址要換為被測服務器的IP地址Prometheus.yml的 targets值網頁訪問的ip部分grafana添加數據源的…

java IO/NIO/AIO

(?▽?)曼波~~~~&#xff01;讓曼波用最可愛的賽馬娘方式給你講解吧&#xff01;(? ???ω??? ?) &#x1f3a0;曼波思維導圖大沖刺&#xff08;先看框架再看細節哦&#xff09;&#xff1a; &#x1f4da; 解釋 Java 中 IO、NIO、AIO 的區別和適用場景&#xff1a; …

Silverlight發展歷程(微軟2021年已經停止支持Silverlight 5)

文章目錄 Microsoft Silverlight 發展歷程引言起源與背景&#xff08;2006-2007&#xff09;互聯網技術格局與微軟的挑戰WPF/E 項目的啟動 Silverlight 1.0 的誕生&#xff08;2007&#xff09;正式命名與首次發布初步的市場定位 Silverlight 2.0&#xff1a;真正的突破&#x…