qt常用的按钮组件

按钮是界面上经常使用的组件,常用的 4 种按钮组件是普通按钮(QPushButton 类)、工具按钮(QToolButton 类)、单选按钮(QRadioButton 类)、复选框(QCheckBox 类),它们都有共同的父类 QAbstractButton, 所以它们有一些共有的特性。例如,QAbstractButton 具有 checkable 和 checked 属性,所以,这 4 种按钮都是可复选的,通过设置属性,普通按钮也可以实现复选框或 单选按钮的功能。

一. 各按钮类的接口详解

1.按钮的属性

QAbstractButton 是抽象类,不能用于创建实际的按钮对象,但它是几个按钮类的父类,所以它定义的属性、接口函数和信号是几个实际的按钮类共有的。

QAbstractButton 类的主要属性
属性属性值类型功能
textQString按钮的显示文字
iconQIcon按钮的图标
shortcutQKeySequence按钮的快捷键
checkablebool按钮是否可复选
checkedbool按钮是否复选的状态
autoExclusivebool在一个布局或一个容器组件内的同类按钮是否是互斥的。如果是互斥的,当其中一 个按钮的 checked 属性被设置为 true 时,其他按钮的 checked 属性被自动设置为 false
autoRepeatbool是否自动重复。如果值为 true,那么在按钮处于按下状态时,将自动重复发射 clicked()、pressed()、released()信号。初次重复的延迟时间由属性 autoRepeatDelay 决定,重复的周期由属性 autoRepeatInterval 决定,时间单位都是毫秒

按钮都具有控制复选状态的属性。3 种常用按钮的外观不一样,用于复选控制的几个属性的默认值与其默认功能是匹配的。

• QPushButton 的 checkable 属性默认值是 false,它一般作为普通按钮使用。

• QRadioButton 和 QCheckBox 的 checkable 属性默认值是 true,它们有复选状态。

• QCheckBox 的 autoExclusive 属性默认值是 false,所以复选框一般用于非互斥的选项。

• QRadioButton 的 autoExclusive 属性默认值是 true,所以单选按钮一般用于互斥的选项。

QPushButton 还新增了 3 个属性:

QPushButton 的新增属性
属性属性值类型功能
autoDefaultbool按钮是否为自动默认按钮
defaultbool按钮是否为默认按钮
flatbool当 flat 属性值为 true 时,按钮没有边框,只有被点击或复选时才显示按钮边框

只有当按钮所在的窗口基类是 QDialog 时,autoDefault 和 default 属性才有意义。在对话框上, 如果一个按钮的 default 属性为 true,它就是默认按钮,按下 Enter 键就相当于点击了默认按钮。 如果一个按钮的 autoDefault 属性为 true,它就是自动默认按钮,当它获得焦点时,它就会变成默 认按钮。

QCheckBox 增加了一个tristate 属性,表示是否允许有3 种复选状态,即除了Checked 和Unchecked, 还有 PartiallyChecked。可以分别用 QAbstractButton 定义的函数 isChecked()和 setChecked()读取和 设置复选状态,也可以分别用 QCheckBox 中定义的函数 checkState()和 setCheckState()读取和设置复选状态。

QRadioButton 没有定义新的属性。

2.按钮的信号

QAbstractButton 类定义了如下几个信号,信号发射的时机见注释: 

void clicked(bool checked = false) //点击按钮时
void pressed() //按下 Space 键或鼠标左键时
void released() //释放 Space 键或鼠标左键时
void toggled(bool checked) //按钮的 checked 属性值变化时

按钮常用的信号是 clicked()。如果按钮是可复选的,还可以使用 clicked(bool)信号,bool 类型参数是点击按钮后 checked 属性的值。

当按钮的 checked 属性值变化时,按钮会发射 toggled(bool)信号,bool 类型参数是变化之后的 checked 属性的值。点击按钮或运行函数 setChecked()会导致 checked 属性值发生变化。 QPushButton 和 QRadioButton 没有定义新信号。QCheckBox 定义了一个新信号,定义如下:

void QCheckBox::stateChanged(int state) 

当复选框的复选状态变化时,组件发射此信号。如果复选框的 tristate 属性设置为 false,也就是只有两种复选状态时,stateChanged()信号和 toggled()信号的作用是一样的。

二. 示例程序功能实现

1.UI 可视化设计

本示例的窗口基类是 QWidget,UI 可视化设计时界面如图所示:

一个布局或一个容器组件内的同类型按钮为一组,QAbstractButton 的 autoExclusive 属性对一组内的按钮有效。在图所示界面中,设 置对齐方式的 3 个按钮通过水平布局设置为一组,设置字体的 3 个按钮也通过水平布局设置为一组。这两组 QPushButton 的主要属性设置如下表所示。

两组 QPushButton 的主要属性设置
按钮分组属性设置描述
对齐方式按钮

checkable=true

autoExclusive=true

flat=true

3 个按钮以平面效果显示,可以被复选,且具有互斥性,功能类似于单选按钮
字体按钮checkable= true autoExclusive=False按钮可以被复选,但不具有互斥性,功能类似于复选框

在上图所示界面中,3 个复选框在一个分组框里水平布局,3 个单选按钮在一个分组框里水平布局。把分组框的 flat 属性设置为 true,分组框就只显示上面的一条边框线。

2.程序功能实现

在 QPushButton 的 Go to slot 对话框中,有 clicked()和 clicked(bool)两个信号。选择对齐方式的3 个按钮是互斥的,点击的按钮自然被选中,无须传递 checked 属性值,所以选择 clicked()信号来 创建槽函数。设置字体的 3 个按钮是可以被选中多个的,所以选择 clicked(bool)信号来创建槽函数。

对于设置编辑框属性的 3 个复选框,应该选择 clicked(bool)信号来创建槽函数。对于设置颜色的3 个单选按钮,应该选择 clicked()信号来创建槽函数。为每个槽函数编写代码,完成后的代码如下:

void Widget::on_btnAlign_Left_clicked() 
{//“居左”按钮
 ui->editInput->setAlignment(Qt::AlignLeft); 
} 
void Widget::on_btnAlign_Center_clicked() 
{//“居中”按钮
 ui->editInput->setAlignment(Qt::AlignCenter); 
} 
void Widget::on_btnAlign_Right_clicked() 
{//“居右”按钮
 ui->editInput->setAlignment(Qt::AlignRight); 
} 
void Widget::on_btnFont_Bold_clicked(bool checked) 
{//“粗体”按钮
 QFont font= ui->editInput->font(); 
 font.setBold(checked); 
 ui->editInput->setFont(font); 
} 
void Widget::on_btnFont_Italic_clicked(bool checked) 
{//“斜体”按钮
 QFont font= ui->editInput->font(); 
 font.setItalic(checked); 
 ui->editInput->setFont(font); 
} 
void Widget::on_btnFont_UnderLine_clicked(bool checked) 
{//“下划线”按钮
 QFont font= ui->editInput->font(); 
 font.setUnderline(checked); 
 ui->editInput->setFont(font); 
} 
void Widget::on_chkBox_Readonly_clicked(bool checked) 
{//Readonly 复选框
 ui->editInput->setReadOnly(checked); 
} 
void Widget::on_chkbox_Enable_clicked(bool checked) 
{//Enabled 复选框
 ui->editInput->setEnabled(checked); 
} 
void Widget::on_chkBox_ClearButton_clicked(bool checked) 
{//ClearButtonEnabled 复选框
 ui->editInput->setClearButtonEnabled(checked); 
} 
void Widget::on_radioBlack_clicked() 
{//Black 单选按钮
 QPalette plet= ui->editInput->palette(); 
 plet.setColor(QPalette::Text, Qt::black); 
 ui->editInput->setPalette(plet); 
} 
void Widget::on_radioRed_clicked() 
{//Red 单选按钮
 QPalette plet= ui->editInput->palette(); 
 plet.setColor(QPalette::Text, Qt::red); 
 ui->editInput->setPalette(plet); 
} 
void Widget::on_radioBlue_clicked() 
{//Blue 单选按钮
 QPalette plet= ui->editInput->palette(); 
 plet.setColor(QPalette::Text, Qt::blue); 
 ui->editInput->setPalette(plet); 
}

QLineEdit 有一个属性 clearButtonEnabled,如果设置为 true,在编辑框的右端就会出现一个小的圆形按钮,点击这个按钮就可以清除编辑框的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值