点击上方蓝字关注我们
2.1 按钮控件组 QT Creator UI设计师界面的按钮组截图如下:
图2-1按钮控件组
以下是对按钮组控件的一些功能介绍:
1. Push Button按压按钮:最普通的按钮,按(点击)按钮命令计算机执行一些动作,或者回答问题,比如windows开始菜单里的重启,注销,关机等按钮。
2. Tool Button工具按钮:工具按钮通常是一个集合,一般集成在工具栏里。比如打开,保存,复制,粘贴,剪切等常用的操作。
3. Radio Button单选按钮:单选按钮通常是两个以上的形式出现在一块,按钮之间有互斥关系,每次只能选中一个。比如:一个人的性别只能选择一个,不能同时是男性又是女性。
4. Check Box复选框:复选框与单选按钮概念相反,复选框通常表示多个可以同时存在的选项,比如一个人可以同时拥有多个爱好,比如读书、看电影、爬山、游泳等。
5. Command Link Button命令链接按钮:一般用来打开的窗口或者网页链接。
6. Dialog Button Box标准按钮盒:标准按钮盒通常用于对话框程序;比如:常见的确认对话框有 “确定”“取消”等标准按钮,Qt 将这些典型的按钮做成标准按钮盒,并将相应的信号加以封装,方便程序员使用。
2.1.1 QAbstractButton类 在学习按钮控件之前必须先了解这些控件类的继承关系,QAbstractButton类是所有按钮控件的基类,派生了QCheckBox, QPushButton, QRadioButton, QToolButton类。QAbstractButton类继承于QWidget,QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。以下介绍按钮类(QAbstractButton)常用接口函数和信号槽。
函数接口
1) 设置按钮文本
QString text() const
void setText(const QString &text)
|
Text获取按钮上显示的文本,setText设置按钮上显示的文本。
2) 设置按钮图标
QIcon icon() const
void setIcon(const QIcon &icon)
|
icon()用于获取当前按钮上显示的图标,seticon()设置显示按钮显示的图标。图标由QIcon类进行描述。
3) 设置图标显示尺寸
QSize iconSize() const
void setIconSize(const QSize &size)
|
图标的尺寸由类QSize表示。
4) 判断按钮是否按下
bool isDown() const
void setDown(bool)
|
按钮按下返回true,否则返回false。setDown(bool)用于手动设置按钮的状态。
5) 判断按钮是否选中
bool isChecked() const
void setChecked(bool)
|
该属性只用于复选框按钮,isChecked()判断复选框按钮是否选中;setChecked()手动设置复选框的状态。当复选框的状态发生改变时将发出toggled()信号。
6) 判断是否是复选按钮
bool isCheckable() const
void setCheckable(bool)
|
该属性只用于复选框按钮,isCheckable()检查按钮是否可以复选。setCheckable(bool)设置按钮是否支持复选。
7) 设置按钮的可用性
bool isEnabled() const
void setEnabled(bool)
|
该属性设置按钮是否可以使用;如果为假,按钮显示为灰色状态,无法使用。有些情况下,按钮需要等待一些条件成立才能使用,就可以使用setEnabled函数设置状态。
图2-2按钮可用性设置
8) 设置按钮快捷键
QKeySequence shortcut() const
void setShortcut(const QKeySequence &key)
|
QkeySequence属性保存了按钮的快捷键方式,按下键盘上的组合键快速按下按钮。该属性在常用的软件中基本都能看到。
设置按钮的快捷方式为”ALT+F1”:
ui->pushButton->setShortcut(tr("Alt+F1"));
|
图2-3快捷方式的运用
按钮常用的槽函数(其他槽函数可以看QWidget类)
1) 执行一个点击事件
void QAbstractButton::click()
|
执行以上函数相当于执行了一个点击按钮的操作。与鼠标点击按钮效果一样!
2) 切换按钮的状态
void QAbstractButton::toggle()
|
如果按钮是按下的状态,执行toggle()函数按钮就变为松开状态,相反也一样。
按钮常用的信号
1) 点击信号
void QAbstractButton::clicked(bool checked = false)
|
按钮按下后松开发出的信号(按下+松开才算一个点击动作)。
2) 按下信号
void QAbstractButton::pressed()
|
按钮按下后发出的信号。可用于检测按钮是否按下。
3) 释放信号
void QAbstractButton::released()
|
按钮松开发出的信号。可用于检测按钮是否松开。
2.1.2 QPushButton按钮 QPushButton按钮是最普通的按压按钮,使用的最为普遍,几乎图形界面都会用到。QPushButton按钮通常是一个矩形,并且显示一个文本标签描述本身的功能。
1. 创建一个QPushButton按钮示例
QPushButton *button = new QPushButton("Download", this);
|
2. QPushButton按钮支持设置菜单显示,以下函数用于设置按钮显示菜单,后面章节会讲到该属性的使用案例。
void QPushButton::setMenu(QMenu *menu)
void QPushButton::showMenu()
|
3. 设置QPushButton按钮支持响应回车键
bool isDefault() const
void setDefault(bool)
|
相当于设置回车键为该按钮的快捷键,一般的对话框按钮都支持回车键确认。
下面用纯代码的形式创建一个按钮,将按钮的信号关联确切到槽,当按钮按下和松开时设置按钮显示的文本。
打开 QtCreator,新建一个 Qt Widgets Application 项目(配套程序编号CH2-1),在新建项目的向导里填写:
① 项目名称 QT_PushButton,创建的路径选择英文路径,点击下一步;
② 套件选择里面选择全部套件,点击下一步;
③ 基类选择 QWidget,其他的选项默认,点击下一步;
④ 项目管理不修改,点击完成。
widget.h文件代码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QPushButton *m_button;/*定义指针*/
/*声明槽函数*/
public slots:
void QPushButton_released_Slots();
void QPushButton_pressed_Slots();
void QPushButton_clicked_Slots();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
|
widget.cpp文件代码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QPushButton *m_button;/*定义指针*/
/*声明槽函数*/
public slots:
void QPushButton_released_Slots();
void QPushButton_pressed_Slots();
void QPushButton_clicked_Slots();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
|
运行效果:
图2-4运行状态
2.1.3 QRadioButton按钮 QRadioButton单选按钮一般用与多选一的互斥选择,可以通过isChecked()函数检测是否选择;同一个父窗口内的单选按钮都是互斥的,每次只能选中一个。
创建QRadioButton单选按钮示例:
QRadioButton *button =new QRadioButton("Radiobutton",this);
|
如果在同一个父窗口内需要定义多组单选按钮,需要使用QButtonGroup进行分组。QButtonGroup类提供了一个按钮部件的抽象容器组,它不提供可视化显示功能,用来管理组中的每个按钮状态。
新建分组示例:
QButtonGroup *gender_Group = new QButtonGroup(this); //新建分组
|
1) 向分组中添加按钮使用addButton函数。addButton函数原型如下:
void QButtonGroup::addButton(QAbstractButton *button, int id = -1)
|
参数:
QAbstractButton * button:QAbstractButton按钮
id:设置单选按钮唯一的 id。(不能是负数,负数表示不设置ID)
2) 删除分组中的按钮使用removeButton函数
void QButtonGroup::removeButton(QAbstractButton *button)
|
3) 获取QButtonGroup分组选中的ID
int QButtonGroup::checkedId() const
|
4) QButtonGroup支持的信号
void buttonClicked(QAbstractButton *button) //分组中的按钮被点击,传递的为按钮的指针。
void buttonClicked(int id) //形参传递的是按钮ID
void buttonPressed(QAbstractButton *button)//分组中的按钮被按下
void buttonPressed(int id)
void buttonReleased(QAbstractButton *button)//分组中的按钮松开
void buttonReleased(int id)
|
打开 QtCreator,新建一个 Qt Widgets Application 项目,继承Qwidget类编写一个例子程序,实现单选按钮的运用。(配套程序编号CH2-2)
1) widget.ui界面文件设计示例
图2-5 界面设计
2) widget.h文件代码示例
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QButtonGroup>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QButtonGroup *gender_Group; //性别选择组
QButtonGroup *marriage_Group; //婚姻状况选择组
private slots:
void on_pushButton_ok_clicked();
void gender_Group_slots(int id); //槽函数
void marriage_Group_slots(int id);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
|
3) widget.cpp文件代码示例
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
/*性别选择组*/
gender_Group = new QButtonGroup(this); //新建分组
gender_Group->addButton(ui->radioButton_boy,0); //添加按钮,设置ID
gender_Group->addButton(ui->radioButton_lady,1);
/*婚姻状况选择组*/
marriage_Group= new QButtonGroup(this); //新建分组
marriage_Group->addButton(ui->radioButton_not,0); //添加按钮,设置ID
marriage_Group->addButton(ui->radioButton_ok,1);
/*关联三个分组的信号和槽*/
connect(gender_Group, SIGNAL(buttonClicked(int)), this, SLOT(gender_Group_slots(int)));
connect(marriage_Group, SIGNAL(buttonClicked(int)), this, SLOT(marriage_Group_slots(int)));
}
Widget::~Widget()
{
delete ui;
}
//获取选择结果
void Widget::on_pushButton_ok_clicked()
{
QString str;//存放显示的结果
int genderID = gender_Group->checkedId();
int marriageID = marriage_Group->checkedId();
/*根据按下的ID区分按键*/
switch(genderID)
{
case 0:
str+="性别:男\n";
break;
case 1:
str+="性别:女\n";
break;
}
/*根据按下的ID区分按键*/
switch(marriageID)
{
case 0:
str+="婚姻状况:未婚\n";
break;
case 1:
str+="婚姻状况:已婚婚\n";
break;
}
/*弹出消息框*/
QMessageBox::information(this, tr("选择结果"),str,QMessageBox::Ok);
}
//性别选择
void Widget::gender_Group_slots(int id)
{
QString str;
/*根据按下的ID区分按键*/
switch(id)
{
case 0:
str+="性别:男";
break;
case 1:
str+="性别:女";
break;
}
/*弹出消息框*/
QMessageBox::information(this, tr("选择结果"),str,QMessageBox::Ok);
}
//分组选择
void Widget::marriage_Group_slots(int id)
{
QString str;
/*根据按下的ID区分按键*/
switch(id)
{
case 0:
str+="婚姻状况:未婚";
break;
case 1:
str+="婚姻状况:已婚婚";
break;
}
/*弹出消息框*/
QMessageBox::information(this, tr("选择结果"),str,QMessageBox::Ok);
}
|
4) 运行效果
图2-6运行效果截图
2.1.4 checkBox按钮 复选按钮的选项可以多选,上一节的单选按钮只能单选。这两种按钮应用都很广泛,遇到需要选择多个选项时,复选按钮非常有用,而且多个复选按钮之间是不冲突的,复选按钮状态发生改变时,会发出toggled()信号,按钮的基本使用方法与单选按钮一样。如果使用了多组复选按钮可以使用groupBox控件进行分组,groupBox控件不会改变复选框的属性。复选框使用了QButtonGroup进行分组,就变成了单选按钮。
创建复选按钮示例:
QCheckBox *checkbox = new QCheckBox("sensitive", this);
|
复选按钮除了普通的选择以外,还提供了三态效果;用来表示未选中、选中、全部选中三种显示效果。相关的函数接口如下:
1) 判断按钮是否支持三态显示
void setTristate(bool y = true);
bool isTristate() const;
|
支持三态显示返回true,否则返回false。可以通过setTristate函数决定按钮是否支持三态显示。
2) 获取三态复选框的状态
void QCheckBox::setCheckState(Qt::CheckState state)
Qt::CheckState QCheckBox::checkState() const
|
setCheckState用于设置状态,checkState()用于获取状态。
三态复选框的状态枚举 enum Qt::CheckState 共有三个枚举常量
枚举常量
| 数值
| 描述
| Qt::Unchecked
| 0
| 未选中
| Qt::PartiallyChecked
| 1
| 选择部分
| Qt::Checked
| 2
| 全部选中
|
3) 三态复选框状态改变信号
void QCheckBox::stateChanged(int state)
|
stateChanged信号发出时就表示三态复选按钮的状态发生了改变,state参数就表示当前的状态。
打开 QtCreator,新建一个 Qt Widgets Application 项目,继承Qwidget类编写一个例子程序,实现复选按钮的运用。(配套程序编号CH2-3)
1) widget.ui文件设计界面示例
本次示例使用了groupBox控件和单行文本编辑器lineEdit。groupBox控件是一个带标题的分组框,lineEdit用来获取输入的文本。
图2-7 UI界面设计
2) widget.h文件代码示例
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_showresult_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
|
3) widget.cpp文件代码示例
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置按钮支持三态显示
ui->checkBox_showstate->setTristate(true);
//设置单选按钮的默认状态
ui->radioButton_boy->setChecked(true);
}
Widget::~Widget()
{
delete ui;
}
//显示选择结果
void Widget::on_pushButton_showresult_clicked()
{
int count=0; //记录选择的数量
QString text="选择结果:\n"; //存放选择结果
/**************姓名***************/
text+="姓名: ";
text+=ui->lineEdit_inputname->text();
text+="\n";
/**************性别***************/
text+="性别: ";
if(ui->radioButton_boy->isChecked())
{
text+="男\n";
}
if(ui->radioButton_girl->isChecked())
{
text+="女\n";
}
/**************兴趣爱好***************/
text+="兴趣爱好: \n";
if(ui->checkBox1->isChecked())
{
text+="羽毛球 ";
count++;
}
if(ui->checkBox2->isChecked())
{
text+="看书 ";
count++;
}
if(ui->checkBox3->isChecked())
{
text+="游泳 ";
count++;
}
if(ui->checkBox4->isChecked())
{
text+="玩游戏 ";
count++;
}
if(ui->checkBox5->isChecked())
{
text+="旅游 ";
count++;
}
if(ui->checkBox6->isChecked())
{
text+="骑车 ";
count++;
}
text+="\n";
/*弹出消息框*/
QMessageBox::information(this, tr("选择结果"),text,QMessageBox::Ok);
/*设置三态显示*/
switch(count)
{
case 0://未选中
ui->checkBox_showstate->setCheckState(Qt::Unchecked);
break;
case 1://部分选中
ui->checkBox_showstate->setCheckState(Qt::PartiallyChecked);
break;
case 6: //全选
ui->checkBox_showstate->setCheckState(Qt::Checked);
break;
}
}
|
4) 运行效果
图2-8复选框例子运行效果截图
2.1.5 commandLinkButton按钮 CommandLinkButton控件(命令链接按钮)继承自QPushButton,CommandLinkButton控件是一种Windows Vista风格的命令链接按钮,它和RadioButton相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是CommandLinkButton除带有正常的按钮上的文字描述文本外,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面,图标可以通过setIcon函数进行更换设置。
创建CommandLinkButton按钮示例:
QCommandLinkButton *linkbutton = new QCommandLinkButton("主文本显示","扩展文本显示", this);
linkbutton->setGeometry(QRect(QPoint(50,50), QSize(200, 80))); //设置按钮的显示位置与大小
|
图2-9 CommandLinkButton命令按钮效果图
1) 可以通过setDescription函数可以设置命令按钮扩展的文本描述信息,扩展显示通常会比当前字体稍小,一般用来描述按钮的详细功能。
QStringdescription() const 获取命令按钮上扩展显示的文本
voidsetDescription(const QString & description) 设置命令按钮显示扩展的文本
|
命令按钮表明按下将打开另一个窗口或页面,这个功能需要通过静态函数openUrl实现。
使用openUrl需要包含#include <QDesktopServices>头文件
openUrl函数原型:
bool QDesktopServices::openUrl(const QUrl & url) 如果成功返回true,否则返回false
|
参数解析:
QUrl 是用于描述网页链接或本地文件链接的类。使用QUrl需要包含#include <QUrl>头文件。
1) 打开一个网站示例
QDesktopServices::openUrl( QUrl("http://www.edu118.com/"));
|
2) 打开一个windows下的文件夹示例
QDesktopServices::openUrl( QUrl("file:///D:/QT_XX"));
|
file:///是三根右斜杠,表示打开本地文件系统里的文件夹或文件。URL里面全部是用右斜杠。
打开 QtCreator,新建一个 Qt Widgets Application 项目,继承Qwidget类。编写例子程序,实现命令按钮的运用。(配套程序编号CH2-4)
1) widget.cpp文件代码示例
#include "widget.h"
#include "ui_widget.h"
#include <QDesktopServices>
#include <QUrl>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//打开网页
void Widget::on_commandLinkButton_clicked()
{
QDesktopServices::openUrl(QUrl("http://www.baidu.com/"));
}
//打开目录
void Widget::on_commandLinkButton_open_dir_clicked()
{
QDesktopServices::openUrl(QUrl("file:///D:/"));
}
|
2) widget.ui文件示例
图2-10 设计界面
3) 运行示例
图2-11 运行界面截图
点击”打开网页”将会调用浏览器打开网页,点击“打开目录“将会打开本地的一个文件夹。
2.1.6 buttonBox按钮盒 按钮盒(ButtonBox)可以很方便地快速布置一组标准按钮,比如:常见的确认对话框有 “OK”“Cancel”等标准按钮,Qt 将这些典型的按钮做成标准按钮盒,并将相应的信号加以封装,方便程序员使用,它有水平和垂直两种样式。
创建ButtonBox按钮盒示例
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel,this);
|
按钮盒标准按钮的枚举值:
常量
| 数值
| 描述
| QDialogButtonBox::Ok
| 0x00000400
| Ok
| QDialogButtonBox::Open
| 0x00002000
| Open
| QDialogButtonBox::Save
| 0x00000800
| Save
| QDialogButtonBox::Cancel
| 0x00400000
| Cancel
| QDialogButtonBox::Close
| 0x00200000
| Close
| QDialogButtonBox::Discard
| 0x00800000
| Discard
| QDialogButtonBox::Apply
| 0x02000000
| Apply
| QDialogButtonBox::Reset
| 0x04000000
| Reset
| QDialogButtonBox::RestoreDefaults
| 0x08000000
| RestoreDefaults
| QDialogButtonBox::Help
| 0x01000000
| Help
| QDialogButtonBox::SaveAll
| 0x00001000
| SaveAll
| QDialogButtonBox::Yes
| 0x00004000
| Yes
| QDialogButtonBox::YesToAll
| 0x00008000
| YesToAll
| QDialogButtonBox::No
| 0x00010000
| No
| QDialogButtonBox::NoToAll
| 0x00020000
| NoToAll
| QDialogButtonBox::Abort
| 0x00040000
| Abort
| QDialogButtonBox::Retry
| 0x00080000
| Retry
| QDialogButtonBox::Ignore
| 0x00100000
| Ignore
| QDialogButtonBox::NoButton
| 0x00000000
| NoButton
|
常用的成员函数
1) 向按钮盒里添加按钮button,定义按钮button的角色为role,如果role无效,则不添加按钮,如果按钮已添加则移除并再次添加为新按钮。
void QDialogButtonBox::addButton(QAbstractButton * button, ButtonRole role)
|
2) 创建一个按钮的文本为text,以指定角色添加到按钮盒,并返回相应的按钮,如果role是无效的,就不创建按钮,返回0。
QPushButton * QDialogButtonBox::addButton(const QString & text, ButtonRole role)
|
3) 向按钮盒中添加一个标准按钮button,并返回标准按钮。如果按钮无效,不添加,返回0。
QPushButton * QDialogButtonBox::addButton(StandardButton button)
|
4) 清除按钮盒,删除所有按钮。
void QDialogButtonBox::clear()
|
5) 移出按钮盒里的按钮button,不删除,设置它的父窗口为0。
void QDialogButtonBox::removeButton(QAbstractButton * button)
|
6) 对应给定的按钮,返回标准按钮枚举值,如果给定的按钮并不是一个标准的按钮,则返回NoButton。
StandardButton QDialogButtonBox::standardButton(QAbstractButton * button) const
|
7) 返回按钮盒对应的标准按钮QPushButton,如果不是标准按钮,则返回0,表示该按钮在这个按钮盒子里不存在。在按钮盒的槽函数里,可以用该函数区分当前是哪一个按钮按下。
QPushButton * QDialogButtonBox::button(StandardButton which) const
|
按钮相关的信号
1) 单击按钮盒里的定义为AcceptRole(确定)和YesRole角色的按钮时,发射该信号。
void QDialogButtonBox::accepted()
|
2) 单击按钮盒里的按钮时,发射该信号
void QDialogButtonBox::clicked(QAbstractButton * button)
|
3) 单击按钮盒里的定义为HelpRole(帮助)角色的按钮时,发射该信号。
void QDialogButtonBox::helpRequested()
|
4) 单击按钮盒里的定义为RejectRole(拒绝)和(否)NoRole角色的按钮时,发射该信号。
void QDialogButtonBox::rejected()
|
打开 QtCreator,新建一个 Qt Widgets Application 项目,继承Qwidget类。编写例子程序,实现命令按钮的运用。(配套程序编号CH2-5)
1) widget.ui文件示例
图2-12 UI设计界面
2) widget.c文件(槽函数处理代码)
void Widget::on_buttonBox_clicked(QAbstractButton *button)
{
QString str="按钮盒测试";
QString button_str="点击的按钮=";
if(ui->buttonBox->button(QDialogButtonBox::Ok)==(QPushButton*)button)
{
//弹窗显示
button_str+="OK";
QMessageBox::information(this,str,button_str);
}
else if(ui->buttonBox->button(QDialogButtonBox::Cancel)==(QPushButton*)button)
{
button_str+="Cancel";
QMessageBox::information(this,str,button_str);
}
else if(ui->buttonBox->button(QDialogButtonBox::Open)==(QPushButton*)button)
{
button_str+="open";
QMessageBox::information(this,str,button_str);
}
}
|
3) 运行效果
图2-13 运行效果
技术合作与咨询
QQ:1126626497 关注我长按二维码可识别微信号:xl1126626497
---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:DS小龙哥 嵌入式技术资讯,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ----------------------------------------------------------------------------------------------------------------------
|