Push Button
使? QPushButton 表??個按鈕.這也是當前我們最熟悉的?個控件了.
QPushButton 繼承? QAbstractButton .這個類是?個抽象類.是其他按鈕的?類
在Qt Designer中也能夠看到這?的繼承關系
屬性 | 說明 |
---|---|
text | 按鈕中的?本 |
icon | 按鈕中的圖標 |
iconSize | 按鈕中圖標的尺? |
shortCut | 按鈕對應的快捷鍵 |
autoRepeat | 按鈕是否會重復觸發.當?標左鍵按住不放時, 如果設為true,則會持續產??標點擊事件; 如果設為false,則必須釋放?標,再次按下?標時才能產?點擊事件. (相當于游戲?柄上的"連發"效果) |
autoRepeatDelay | 重復觸發的延時時間.按住按鈕多久之后,開始重復觸發. |
autoRepeatInterval | 重復觸發的周期. |
- QAbstractButton 作為 QWidget 的?類,當然也繼承了 QWidget 的屬性.上?介紹的 QWidget ?的各種屬性?法,對于 QAbstractButton 同樣適?.因此表格僅
列出 QAbstractButton 獨有的屬性. - Qt的api設計?格是?常清晰的.此處列出的屬性都是可以 獲取 和 設置 的.例如,使? text() 獲取按鈕?本;使? setText() 設置?本.
事實上, QPushButton 的核?功能都是 QAbstractButton 提供的.??提供的屬性都?較簡單.
其中 default 和 audoDefault 影響的是按下enter時?動點擊哪個按鈕的?為; flat 把按鈕設置為扁平的樣式.這?我們暫時都不做過多關注.
代碼?例:帶有圖標的按鈕
1)創建 resource.qrc ?件,并導?圖?
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(":/dog.jpg");//設置圖標ui->pushButton->setIcon(icon);
}Widget::~Widget()
{delete ui;
}
#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;
}
代碼?例:帶有快捷鍵的按鈕
1)在界?中拖五個按鈕.
五個按鈕的objectName分別為 pushButton_target , pushButton_up ,pushButton_down ,pushButton_left , pushButton_right 五個按鈕的初始位置隨意,其中 pushButton_target 尺?設置為100*100
,其余按鈕設為50*50
.?本內容均清空
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/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;
}
完成槽函數
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
編寫槽函數
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("你選擇的性別為:其他");
}
在構造函數添加默認選項
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);
}
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的屬性
代碼?例:click,press,release,toggled的區別
- 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_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;
}
3)運?程序,可以看到
- clicked 是?次?標按下+?標釋放觸發的.
- pressed 是?標按下觸發的.
- released 是?標釋放觸發的.
- toggled 是checked屬性改變時觸發的.
總的來說,toggled是最適合 QRadioButton 的
代碼?例:單選框分組
1)在界?上創建6個單選框,?來模擬?當勞點餐界?.
objectName 分別為 radioButton 到 radioButton_6
此時直接運?程序,可以看到,這六個 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);
}
再次執?程序,可以看到可以按照正確的分組?式來完成排他了
Check Box
QCheckBox 表?復選按鈕.可以允許選中多個.和 QCheckBox 最相關的屬性也是 checkable 和 checked ,都是繼承?QAbstractButton .
?于 QCheckBox 獨有的屬性 tristate ?來實現"三態復選框".這個東西?較冷?,
代碼?例:獲取復選按鈕的取值
1)在界?上創建三個復選按鈕,和?個普通按鈕.
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)運?程序,可以看到點擊確認按鈕時,就會在控制臺中輸出選中的內容
Tool Button
QToolButton 的?部分功能,和 QPushButton 是?致的.但是 QToolButton 主要應?在?具欄,菜單等場景