【QT】常?控件詳解(三)常用按鈕控件PushButton RadioButton CheckButton Tool Button

請添加圖片描述

文章目錄

  • 前言
  • 一、PushButton
    • 1.1 QAbstractButton
    • 1.2 添加圖標的按鈕
    • 1.3 給按鈕添加快捷鍵
    • 1.4 代碼?例:按鈕的重復觸發
  • 二、 RadioButtion
    • 2.1簡介
    • 2.2 幾個槽函數 click,press,release, toggled 的區別
    • 2.2 模擬分組點餐
  • 三、 CheckBox
  • 四、Tool Button
  • 🚩總結


前言

一、PushButton

1.1 QAbstractButton

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

在這里插入圖片描述
在QtDesigner中也能夠看到這?的繼承關系.
在這里插入圖片描述
QAbstractButton 中,和QPushButton 相關性較?的屬性

屬性說明
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.2 添加圖標的按鈕

1)創建resource.qrc?件,并導?圖?

#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
#include <QSize>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/hachimitsu.jpg");ui->pushButton->setIcon(icon);ui->pushButton->setIconSize(QSize(100, 1000));}

1)在界面中拖五個按鈕.
五個按鈕的objectName分別為pushButton_target , pushButton_up,pushButton_down , pushButton_left , pushButton_right
五個按鈕的初始位置隨意,其中 pushButton_target尺寸設置為100*100,其余按鈕設為50*50.文本內容均清空
在這里插入圖片描述

在這里插入圖片描述
2) 創建resource.qrc ,并導?5個圖?.
在這里插入圖片描述

像上述這樣的圖?資源,可以在"阿?巴巴?量圖標庫"中查找并免費下載.
https://www.iconfont.cn/

1.3 給按鈕添加快捷鍵

  1. 修改widget.cpp,設置圖標資源和快捷鍵
    使用setShortcut給按鈕設置快捷鍵.參數是一個QKeySequence對象.表示一個按鍵序列.支持組合鍵(ctrl+c這種).
    QKeySequence的構造函數參數,可以直接使用"ctrl+c"這樣的按鍵名字符串表示,也可以使用預定義好的常量(形如Qt : : CTRL + Qt : :Key_C )表示.
#include "widget.h"
#include "ui_widget.h"
#include <QIcon>
#include <QSize>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 正確設置目標按鈕的圖標(QPushButton使用setIcon而非setPixmap)QIcon targetIcon(":/hachimitsu.jpg");ui->pushButton_target->setIcon(targetIcon);// 設置圖標大小(根據需要調整,避免過大或過小)ui->pushButton_target->setIconSize(QSize(140, 120));  // 修正原代碼中1000的不合理高度// 方向按鈕圖標設置ui->pushButton_up->setIcon(QIcon(":/up.png"));ui->pushButton_down->setIcon(QIcon(":/down.png"));ui->pushButton_left->setIcon(QIcon(":/left.png"));ui->pushButton_right->setIcon(QIcon(":/right.png"));// 統一方向按鈕圖標大小QSize btnSize(30, 30);ui->pushButton_up->setIconSize(btnSize);ui->pushButton_down->setIconSize(btnSize);ui->pushButton_left->setIconSize(btnSize);ui->pushButton_right->setIconSize(btnSize);// 設置快捷鍵// 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::~Widget()
{delete ui;
}// 上移按鈕
void Widget::on_pushButton_up_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());qDebug() << "上移";  // 修正調試信息
}// 下移按鈕
void Widget::on_pushButton_down_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());qDebug() << "下移";  // 修正調試信息
}// 左移按鈕
void Widget::on_pushButton_left_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());qDebug() << "左移";  // 修正調試信息
}// 右移按鈕
void Widget::on_pushButton_right_clicked()
{const QRect& rect = ui->pushButton_target->geometry();ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());qDebug() << "右移";  // 修正調試信息
}
  1. 運?程序,此時點擊按鈕,或者使?wasd 均可讓哈基米飛行移動.

在這里插入圖片描述

1.4 代碼?例:按鈕的重復觸發

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

// 開啟重復觸發
ui->pushButton_up->setAutoRepeat(true);
ui->pushButton_down->setAutoRepeat(true);
ui->pushButton_left->setAutoRepeat(true);
ui->pushButton_right->setAutoRepeat(true);

此時,按住?標時,即可讓哈基米連續飛行移動.

二、 RadioButtion

2.1簡介

屬性說明
checkable是否能選中
checked是否已經被選中。checkablechecked 的前提條件。
autoExclusive是否排他。
選中一個按鈕之后是否會取消其他按鈕的選中。
對于 QRadioButton 來說默認就是排他的。

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

  1. 修改widget.cpp,編輯三個QRadioButton 的slot函數.
void Widget::on_radioButton_male_clicked()
{ui->label->setText("你的選擇的性別為:男");
}void Widget::on_radioButton_female_clicked()
{ui->label->setText("你的選擇的性別為:女");
}void Widget::on_radioButton_other_clicked()
{ui->label->setText("你的選擇的性別為:其他");
}
  1. 運?程序,可以看到隨著選擇不同的單選按鈕,label中的提??字就會隨之變化.
    在這里插入圖片描述
  2. 當前代碼中,如果程序啟動,則不會選擇任何選項.
    可以修改代碼,讓程序啟動默認選中性別男
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置默認選中按鈕ui->radioButton_male->setChecked(true);ui->label->setText("你的選擇的性別為:男");
}

此時運?程序,即可看到性別男已經被選中了.

在這里插入圖片描述

  1. 當前代碼中,也可以禁?"其他"被選中.

修改widget.cpp的構造函數

 // 禁? other 選項ui->radioButton_other->setCheckable(false);

可見無論怎么點其他都無法選中
在這里插入圖片描述

2.2 幾個槽函數 click,press,release, toggled 的區別

一直用clicked,這次來學習一下,這剩下四個的區別

  • clicked表??次"點擊"
  • pressed表??標"按下"
  • released表??標"釋放"
  • toggled表?按鈕狀態切換
  1. 在界?上創建四個單選按鈕
    objectName分別為radioButton , radioButton_2 , radioButton_3 ,radioButton_4
    在這里插入圖片描述
    2)給1創建clicked槽函數,給2創建pressed槽函數,給3創建released槽函數,給4創建toggled槽函數.
void Widget::on_radioButton_1_clicked(bool 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)
{if (checked) {qDebug() << "toggled checked true";} else {qDebug() << "toggled checked false";}
}
  1. 運?程序,可以看到
  • clicked 是?次?標按下+?標釋放觸發的.
  • pressed 是?標按下觸發的.
  • released 是?標釋放觸發的.
  • toggledchecked屬性改變時觸發的.
    總的來說,toggled是最適合

2.2 模擬分組點餐

  1. 在界?上創建6個單選框,?來模擬?當勞點餐界?.
    objectName 分別為radioButtonradioButton_6
    在這里插入圖片描述
    此時直接運?程序,可以看到,這六個QRadioButton 之間都是排他的.(也就是六個只能選一個)
    我們希望每?組內部來控制排他,但是組和組之間不能排他
    在這里插入圖片描述

  2. 引?QButtonGroup進?分組.
    修改widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QButtonGroup>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//創建三個 QButtonGroupQButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);QButtonGroup* group3 = new QButtonGroup(this);//把 QRadioButton 兩兩一組,放到三個 QButtonGroup中group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group2->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group3->addButton(ui->radioButton_5);group3->addButton(ui->radioButton_6);
}

再次執?程序,可以看到可以按照正確的分組?式來完成排他了
在這里插入圖片描述

三、 CheckBox

  • QcheckBox表示復選按鈕.可以允許選中多個.
  • QcheckBox最相關的屬性也是checkablechecked ,都是繼承自QAbstractButton .
  • 至于QCheckBox獨有的屬性tristate用來實現"三態復選框".這個東西比較冷門,咱們課堂不做討論.

1)在界面上創建三個復選按鈕,和一個普通按鈕.
objectName分別為checkBox_eat , checkBox_sleep , checkBox_play ,以及pushButton
在這里插入圖片描述

  1. pushButton 添加slot函數
void Widget::on_pushButton_clicked()
{// 1. 重置結果,避免重復疊加QString result = "今天你的安排是:";// 2. 用列表存儲選中的內容,自動處理逗號QStringList tasks;if (ui->checkBox_eat->isChecked())   tasks << ui->checkBox_eat->text();if (ui->checkBox_sleep->isChecked()) tasks << ui->checkBox_sleep->text();if (ui->checkBox_play->isChecked())  tasks << ui->checkBox_play->text();// 3. 拼接內容(自動用逗號分隔)result += tasks.join("、");// 4. 更新顯示 + 調試輸出ui->label->setText(result);qDebug() << "選中的內容:" << result;
}

效果:
在這里插入圖片描述

四、Tool Button

QToolButton的大部分功能,和QPushButton是一致的.但是QToolButton主要應用在工具欄,菜單等場景.這個我們暫時先不介紹.
下篇寫完會附注鏈接


🚩總結

在這里插入圖片描述

屬性說明
checkable是否能選中
checked是否已經被選中。checkablechecked 的前提條件。
autoExclusive是否排他。
選中一個按鈕之后是否會取消其他按鈕的選中。
對于 QRadioButton 來說默認就是排他的。

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

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

相關文章

數據結構:反轉鏈表(reverse the linked list)

目錄 通過交換元素值實現反轉&#xff08;reverse by swapping elements&#xff09; 滑動指針&#xff08;sliding pointers&#xff09; 使用滑動指針反轉鏈表&#xff08;Reversing a Linked List using Sliding Pointers&#xff09; 對比分析 如何用遞歸&#xff08;R…

【C#】基于SharpCompress實現壓縮包解壓功能

1.SharpCompress安裝 在vs的nuget下搜索安裝SharpCompress&#xff0c;如圖所示2.解壓縮包功能實現 /// <summary> /// 解壓壓縮包 /// </summary> /// <param name"filePath">壓縮包文件路徑</param> /// <param name"directoryPat…

mybatis連接PGSQL中對于json和jsonb的處理方法

pgsql數據庫表字段設置了jsonb格式&#xff1b;在java的實體里使用String或者對象轉換會一直提示一個錯誤&#xff1a; Caused by: org.postgresql.util.PSQLException: ERROR: column “xx” is of type jsonb but expression is of type character varying 需要加一個轉換方法…

Spring AI Alibaba Graph 深度解析:原理、架構與應用實踐

1. 引言概述 1.1 什么是 Spring AI Alibaba Graph Spring AI Alibaba Graph 是阿里云團隊基于 Spring AI 生態開發的一個強大的工作流編排框架&#xff0c;專門用于構建復雜的 AI 應用。它采用聲明式編程模型&#xff0c;通過圖結構來定義和管理 AI 工作流&#xff0c;讓開發…

C++少兒編程(二十一)—軟件執行流程

讓我們將以下程序視為用C編寫的示例程序。步驟1&#xff1a;預處理器將源代碼轉換為擴展代碼。當您運行程序時&#xff0c;源代碼首先被發送到稱為預處理器的工具。預處理器主要做兩件事&#xff1a;它會從程序中刪除注釋。它擴展了預處理器指令&#xff0c;如宏或文件包含。它…

精通Webpack搭建Vue2.0項目腳手架指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;在Web應用程序開發中&#xff0c;Vue 2.0因其虛擬DOM、單文件組件、增強的生命周期鉤子和Vuex及Vue Router狀態管理與路由解決方案&#xff0c;成為了提高開發效率和代碼組織性的關鍵。Webpack作為必不可少的模…

無償分享120套開源數據可視化大屏H5模板

數據可視化跨越了語言、技術和專業的邊界&#xff0c;是能夠推動實現跨界溝通&#xff0c;實現國際間跨行業的創新的工具。正如畫家用顏料表達自我&#xff0c;作者用文字講述故事&#xff0c;而統計人員用數字溝通 ...... 同樣&#xff0c;數據可視化的核心還是傳達信息。而設…

Qt按鍵響應

信號與槽機制是一個非常強大的事件通信機制&#xff0c;是 Qt 最核心的機制之一&#xff0c;初學者掌握它之后&#xff0c;幾乎可以做任何交互操作。信號&#xff08;Signal&#xff09; 是一種“事件”或“通知”&#xff0c;比如按鈕被點擊、文本改變、窗口關閉等。 槽&#…

【Git】常見命令整理

Git分區與操作關系&#xff1a;Working Directory&#xff08;工作區&#xff0c;對于本地的編輯和修改在此進行&#xff09;->Staging Area&#xff08;暫存區/Index&#xff0c;在工作區進行git add操作后的位置&#xff09;->Git Repository&#xff08;本地倉庫&…

Linux-Shell腳本基礎用法

1.變量定義變量命名規則&#xff1a;可以包含字母&#xff0c;數字&#xff0c;下劃線&#xff0c;首字母不能用數字開頭&#xff0c;中間不能又空格&#xff1b;為變量賦值等號之間不能為空格&#xff1b;變量命名不能使用標點符號&#xff0c;不能使用bash的關鍵字&#xff1…

JS中的Map和WeakMap區別和聯系

JavaScript 中 Map 與 WeakMap 的區別、聯系及示例核心區別特性MapWeakMap鍵的類型允許任意類型的鍵&#xff08;對象、原始值&#xff09;鍵必須是對象&#xff08;非原始值&#xff09;垃圾回收強引用鍵 → 阻止垃圾回收弱引用鍵 → 不影響垃圾回收可遍歷性支持遍歷&#xff…

Linux 環境 libpq加載異常導致psql 連接 PostgreSQL 庫失敗失敗案例

文章目錄局點現象定位結論局點環境補充知識點如下庫文件加載順序關鍵事實&#xff1a;您系統中的證據&#xff1a;優先級對比表&#xff1a;解決方案強化&#xff1a;最終檢查&#xff1a;本局點解決方法局點現象 數據庫 mdm 升級失敗檢查日志, 發現是由于 psql 連接數據庫報錯…

C# XML 文件

在 C# 中處理 XML 文件是非常常見的操作&#xff0c;可以使用System.Xml命名空間中的類來實現。以下是一些常用的 XML 操作示例&#xff1a; 手冊鏈接&#xff1a; System.Xml 命名空間 XmlDocument 創建一個xml數據格式的文檔 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物體導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作(且解決動態模糊)

前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

【Django】-3- 處理HTTP響應

HttpResponse 家族” 的常用操作&#x1f31f;1. 設置狀態碼 &#x1f44b;狀態碼是服務器告訴客戶端 “請求處理結果” 的數字暗號&#xff08;比如 404 表示 “沒找到頁面”&#xff09;。Django 里有 3 種設置方式&#xff1a;方式 1&#xff1a;直接寫數字&#xff08;簡單…

《React Router深解:復雜路由場景下的性能優化與導航流暢性構建》

路由系統是連接用戶操作與應用功能的中樞神經,而React Router作為React生態中處理路由邏輯的核心工具,其在復雜應用中的表現直接決定著用戶體驗的優劣。當應用規模擴張至數十甚至上百個路由,嵌套層級跨越多層,導航控制中的性能問題便會逐漸凸顯——從首屏加載的延遲到路由切…

網絡與信息安全有哪些崗位:(4)應急響應工程師

想知道網絡與信息安全領域有哪些具體崗位嗎&#xff1f; 網絡與信息安全有哪些崗位&#xff1a;&#xff08;1&#xff09;網絡安全工程師-CSDN博客 網絡與信息安全有哪些崗位&#xff1a;&#xff08;2&#xff09;滲透測試工程師_網絡安全滲透工程師-CSDN博客 網絡與信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3634. Minimum Removals to Balance Array 1. 解題思路 這一題思路上就是一個滑動窗口的思路。 我們首先將整個數組有序排列&#xff0c;然后分別從左向右考察每一個元素作為…

C#/.NET/.NET Core優秀項目和框架2025年7月簡報

前言 每月定期推廣和分享的C#/.NET/.NET Core優秀項目和框架&#xff08;每周至少會推薦兩個優秀的項目和框架當然節假日除外&#xff09;&#xff0c;推文中有項目和框架的詳細介紹、功能特點、使用方式以及部分功能截圖等。注意&#xff1a;排名不分先后&#xff0c;都是十分…

第 10 篇:深度學習的“軍火庫”——CNN、RNN與Transformer,AI如何看懂世界?

《人工智能AI之機器學習基石》系列⑩ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。 引