文章目錄
- 前言
- 一、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 | 重復觸發的周期。 |
- 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 給按鈕添加快捷鍵
- 修改widget.cpp,設置圖標資源和快捷鍵
使用setShortcut給按鈕設置快捷鍵.參數是一個QKeySequence對象.表示一個按鍵序列.支持組合鍵(ctrl+c這種).
QKeySequence
的構造函數參數,可以直接使用"ctrl+c"
這樣的按鍵名字符串表示,也可以使用預定義好的常量(形如Qt : : CTR
L +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() << "右移"; // 修正調試信息
}
- 運?程序,此時點擊按鈕,或者使?
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 | 是否已經被選中。checkable 是 checked 的前提條件。 |
autoExclusive | 是否排他。 選中一個按鈕之后是否會取消其他按鈕的選中。 對于 QRadioButton 來說默認就是排他的。 |
QRadioButton
是單選按鈕.可以讓我們在多個選項中選擇一個.
作為QAbstractButton
和 Qwidget
的子類,上面介紹的屬性和用法,對于 QRadioButton
同樣適用.
QAbstractButton
中和QRadioButton
關系較大的屬性
- 修改
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("你的選擇的性別為:其他");
}
- 運?程序,可以看到隨著選擇不同的單選按鈕,label中的提??字就會隨之變化.
- 當前代碼中,如果程序啟動,則不會選擇任何選項.
可以修改代碼,讓程序啟動默認選中性別男
#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("你的選擇的性別為:男");
}
此時運?程序,即可看到性別男已經被選中了.
- 當前代碼中,也可以禁?"其他"被選中.
修改widget.cpp的構造函數
// 禁? other 選項ui->radioButton_other->setCheckable(false);
可見無論怎么點其他都無法選中
2.2 幾個槽函數 click,press,release, toggled 的區別
一直用clicked,這次來學習一下,這剩下四個的區別
- clicked表??次"點擊"
- pressed表??標"按下"
- released表??標"釋放"
- toggled表?按鈕狀態切換
- 在界?上創建四個單選按鈕
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";}
}
- 運?程序,可以看到
clicked
是?次?標按下+?標釋放觸發的.- pressed 是?標按下觸發的.
released
是?標釋放觸發的.toggled
是checked
屬性改變時觸發的.
總的來說,toggled是最適合
2.2 模擬分組點餐
-
在界?上創建6個單選框,?來模擬?當勞點餐界?.
objectName
分別為radioButton
到radioButton_6
此時直接運?程序,可以看到,這六個QRadioButton
之間都是排他的.(也就是六個只能選一個)
我們希望每?組內部來控制排他,但是組和組之間不能排他
-
引?
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
最相關的屬性也是checkable
和checked
,都是繼承自QAbstractButton
. - 至于
QCheckBox
獨有的屬性tristate
用來實現"三態復選框".這個東西比較冷門,咱們課堂不做討論.
1)在界面上創建三個復選按鈕,和一個普通按鈕.
objectName
分別為checkBox_eat
, checkBox_sleep
, checkBox_play
,以及pushButton
- 給
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 | 是否已經被選中。checkable 是 checked 的前提條件。 |
autoExclusive | 是否排他。 選中一個按鈕之后是否會取消其他按鈕的選中。 對于 QRadioButton 來說默認就是排他的。 |