【Qt開發】按鈕類控件(一)-> QPushButton

目錄

1 -> 什么是 PushButton?

2 -> 相關屬性

3 -> 代碼示例

3.1 -> 帶有圖標的按鈕

3.2 -> 帶有快捷鍵的按鈕

4 -> 總結


1 -> 什么是 PushButton?

在 Qt 框架中,QPushButton 是最基礎且最常用的按鈕控件之一,它是用戶界面交互的核心元素。作為 QAbstractButton 類的子類,PushButton 代表了傳統的可點擊按鈕,用于觸發應用程序中的特定操作或命令。

QPushButton 繼承自 QAbstractButton。這個類是一個抽象類,是其他按鈕的父類。

Qt Designer 中也能夠看到這里的繼承關系。

2 -> 相關屬性

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 把按鈕設置為扁平的樣式。

3 -> 代碼示例

3.1 -> 帶有圖標的按鈕

1. 創建 rasource.qrc 文件,并導入圖片

具體操作參見:【Qt開發】常用控件(四)

2. 在界面上創建一個按鈕

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(":/Science.png");// 設置圖標ui->pushButton->setIcon(icon);// 設置圖標尺寸ui->pushButton->setIconSize(QSize(50, 50));}Widget::~Widget()
{delete ui;
}

4. 執行程序,觀察效果

3.2 -> 帶有快捷鍵的按鈕

1. 在界面中拖五個按鈕

五個按鈕的 objectName 分別為?pushButton_target、pushButton_down、pushButton_up、pushButton_left、pushButton_right。

五個按鈕的初始位置隨意,文本內容均清空。

2. 創建 resource.qrc,并導入 5 張圖片

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

  • 使用 setShortcut 給按鈕設置快捷鍵。參數是一個 QKeySequence 對象。表示一個按鍵序列。支持組合鍵(類似 ctrl + c 這種)。
  • QKeySequence 的構造函數參數,可以直接使用 “ctrl + c” 這樣的按鍵名字符串表示,也可以使用預定義好的常量(形如 Qt::CTRL + Qt::Key_C)表示。
#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/Science.png"));ui->pushButton_target->setIconSize(QSize(50, 50));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));// 直接通過按鍵的名字來設置. 雖然簡單, 但是容易寫錯//    ui->pushButton_up->setShortcut(QKeySequence("ctrl + 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::CTRL + Qt::Key_W));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;
}

4. 修改 widget.cpp,設置四個方向鍵的 slot 函數

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());
}

5. 運行程序,此時點擊按鈕,或者使用 wsad 均可以讓其移動

通過以上代碼,按住快捷鍵,確實可以進行重復觸發。但是鼠標點擊卻不能。

修改 widget.cpp,在構造函數中開啟重復觸發。

// 開啟鼠標點擊的連發功能(鍵盤的連發默認就是支持的)ui->pushButton_up->setAutoRepeat(true);ui->pushButton_down->setAutoRepeat(true);ui->pushButton_left->setAutoRepeat(true);ui->pushButton_right->setAutoRepeat(true);

此時,按住鼠標時,可以讓其連續移動。

4 -> 總結

QPushButton 作為 Qt 框架中最基礎的交互控件之一,體現了 Qt 設計哲學的核心原則:功能豐富性、跨平臺一致性和用戶友好性。它不僅僅是一個簡單的點擊區域,而是一個完整的交互系統,包含了狀態管理、視覺反饋、無障礙訪問等綜合特性。

理解 PushButton 的完整特性集有助于我們創建出更直觀、更易用且符合現代設計標準的應用程序界面。其靈活的自定義能力和豐富的功能選項使其能夠適應從傳統桌面應用到現代扁平化設計的各種界面需求,是 Qt開發者 工具箱中不可或缺的重要組件。



?

感謝各位大佬支持!!!

互三啦!!!

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

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

相關文章

Citrix 零日漏洞自五月起遭積極利用

安全研究員 Kevin Beaumont 披露了有關 CVE-2025-6543 的驚人細節,這是一個嚴重的 Citrix NetScaler 漏洞,在該公司發布補丁之前的幾個月里,該漏洞被積極利用作為零日攻擊。 Citrix 最初將其輕描淡寫為簡單的“拒絕服務”漏洞,但…

【系列08】端側AI:構建與部署高效的本地化AI模型 第7章:架構設計與高效算子

第7章:架構設計與高效算子 要將AI模型成功部署到端側,除了對現有模型進行壓縮和優化,更根本的方法是在設計之初就考慮其在資源受限環境下的運行效率。本章將深入探討如何設計高效的網絡架構,以及如何理解并優化常用的核心算子。高…

42-Ansible-Inventory

文章目錄Ansible基本概述手動運維時代(原始社會)自動化運維時代自動化運維工具的優勢Ansible的功能及優點Ansible的架構Ansible的執行流程安裝AnsibleAnsible配置文件生效順序Ansible inventory主機清單Ansible基于免秘鑰方式管理客戶端小結Ansible-Adho…

Go語言runtime/trace工具全面解析

基本概念與功能 Go語言的runtime/trace是Go標準庫中內置的性能分析工具,主要用于追蹤和可視化Go程序的運行時行為。它能夠記錄程序執行期間的各種事件,包括goroutine調度、系統調用、垃圾回收(GC)、網絡I/O、鎖等待等關鍵信息。 trace工具的核心功能包括: goroutine生命周期…

Docker(自寫)

Docker程序是跑在操作系統上的,而操作系統上又裝了各種不同版本的依賴庫和配置程序依賴環境,環境不同,程序就可能跑不起來,如果我們能將環境和程序一起打包docker就是可以將程序和環境一起打包并運行的工具軟件基礎鏡像DockerFile…

深度拆解 OpenHarmony 位置服務子系統:從 GNSS 到分布式協同定位的全鏈路實戰

1. 系統概述 OpenHarmony 的“定位子系統”就是硬件服務子系統集里的 “位置服務子系統”(Location SubSystem)。它向下對接 GNSS/GPS、基站、Wi-Fi 等定位模組,向上以 標準位置 API 形式為應用提供 實時位置、軌跡、地理圍欄 等能力,并可與分布式軟總線聯動,實現 跨設備…

React Native基本用法

1,index調用registerComponent,把appName注入到React Native的根節點。 2,package.json是全局大管家,package-lock.json鎖定版本,不會手動編輯,通過install安裝 3, bebal.config.json bebal.config.json是翻…

LoraConfig target modules加入embed_tokens(64)

LoraConfig target modules加入embed_tokens 更好且成本更低的方法 嵌入層(embedding layer)的 lora_embedding_A 和 lora_embedding_B 頭部(head)是否需加入目標模塊列表 用戶警告 解除權重綁定 解綁以后是隨機權重,怎么辦 更好且成本更低的方法 “有沒有一種更好且成本…

筆記共享平臺|基于Java+vue的讀書筆記共享平臺系統(源碼+數據庫+文檔)

筆記共享平臺|讀書筆記共享平臺系統 目錄 基于Javavue的讀書筆記共享平臺系統 一、前言 二、系統設計 三、系統功能設計 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取 博主介紹:??大廠碼農|畢設布道師&#xff…

【VSCode】VSCode為Java C/S項目添加圖形用戶界面

為Java C/S項目添加圖形用戶界面 現在我們來為它添加圖形用戶界面(GUI)。我將使用Java Swing庫創建一個簡單的GUI,因為它內置于Java標準庫中,無需額外依賴。 客戶端GUI實現 首先,我們將修改客戶端代碼,添加一個Swing GUI界面&…

【云原生】Docker 搭建Kafka服務兩種方式實戰操作詳解

目錄 一、前言 二、Docker 搭建kafka介紹 2.1 Docker 命令部署 2.2 使用Docker Compose 部署 2.3 使用 Docker Swarm 2.4 使用 Kubernetes 2.5 部署建議 三、Docker 搭建kafka操作方式一 3.1 前置準備 3.2 完整操作過程 3.2.1 創建docker網絡 3.2.2 啟動zookeeper容…

DBeaver中禁用PostgreSQL SSL的配置指南

在DBeaver中為PostgreSQL連接禁用SSL是一個常見的配置,特別是當你的數據庫服務器未啟用SSL或遇到連接問題時。我來為你詳細講解操作步驟和注意事項。 🛠? DBeaver中禁用PostgreSQL SSL的配置指南 詳細步驟 打開驅動設置:在DBeaver中創建新的…

數組去重【JavaScript】

數組去重,并且key和val相同的對象視為相同的,需要去重。主函數:/*** 數組去重* 兩個屬性相同的對象也認為是相同的* param {Array} arr* return {Array} */ function uniqueArray(arr) {const result []// outer: 標簽,標記外層循…

基于單片機設計的智能停車系統_271

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

for in+邏輯表達式 生成迭代對象,最后轉化為列表 ——注意list是生成器轉化為列表,但[生成器]得到的就是一個列表,其中包含一個生成器元素

(int(digit) ** 2 for digit in str(n))這個不是 數組(list),而是一個 生成器表達式 (generator expression)。它的作用是:str(n) 把數字 n 轉成字符串,例如 n 82 → "82"。for digit in str(n) 遍歷字符串中的每個字符 → "…

通信算法之321:verilog中generate if 用法-綜合掉無用分支

文章目錄 一.示例代碼 二.優缺分析 三. generate - case 一.示例代碼 提示:參考 // 根據添加/補償頻偏的標志,確定使用的頻偏wire signed [WIDTH-1 : 0] freq;generateif(FREQ_FLAG == 1b1) beg

Shell 入門

目錄 一、Shell 是什么 二、 .sh 腳本調用 .py 腳本 Python 核心邏輯腳本(data_processor.py) Shell 腳本(pipeline.sh) 三、常見命令 四、.sh腳本 1. 簡單例子 2. 進階例子 3. 猜數字游戲 一、Shell 是什么 Shell 的本…

UNet改進(36):融合FSATFusion的醫學圖像分割

1. 注意力機制的理論基礎 1.1 空間注意力機制 空間注意力機制模擬人類視覺系統,能夠關注圖像中的顯著區域。其核心思想是根據特征圖的空間位置生成權重圖,突出重要區域并抑制無關信息。常見的實現方式是通過沿通道維度的池化操作獲取空間統計信息,然后通過卷積層生成空間注…

docker安裝kafka、zookeeper詳細步驟

Kafka 簡介 Kafka 是一個分布式流處理平臺,由 LinkedIn 開發并開源,主要用于高吞吐量的實時數據管道和流處理。 核心特性 高吞吐量:支持每秒百萬級消息處理,適合大數據場景。 持久化存儲:消息可持久化到磁盤,并支持多副本備份。 分布式架構:支持水平擴展,通過分區(P…

Photoshop - Ps 編輯圖像

使用基本圖像編輯技術,讓圖像展現出最好的一面。1.修剪和拉直使用裁剪工具,可以修剪邊緣,更改圖像的形狀和大小,甚至可以對圖像進行拉直和彎曲的操作。2.改善亮度和色彩點擊菜單欄-編輯-調整-亮度/對比度,調整圖像的亮…