常用控件 一
- 按钮类控件
- QPushButton
- QRadioButton
- QCheckBox
按钮类控件
QPushButton
使用QPushButton表示一个按钮,这是我们当前最熟悉的一个控件了;
QPushButton继承自QAbstractButton,这个类是个抽象类,是其他按钮类的父类;
QAbstractButton的一些属性:
属性 | 说明 |
---|---|
text | 按钮文本 |
icon | 按钮图标 |
iconSize | 按钮图标大小 |
shortCut | 按钮对应的快捷键 |
autoRepeat | 按钮是否会重复触发;如果设置为true,鼠标左键一直按着,则会产生持续的鼠标点击事件;如果设置为false,鼠标左键一直按着,则不会触发持续的鼠标点击事件,只有当鼠标松开,再次按下才会触发一次鼠标点击事件; |
autoRepeatDelay | 重复触发的延时时间,按住按钮多久过后,开始重复触发 |
autoRepeatInterval | 重复触发的周期 |
- QAbstractButton作为QWidget的子类,当然也继承了QWidget的属性,上面介绍的属性是QAbstractButton的单独属性,那么前面介绍的QWidget核心属性对应QAbstractButton同样适用;
- Qt的API设计风格非常清晰,上面列出的属性都是可以获取和设置的;eg:获取文本:text();设置文本:setText(“你好”);
- 事实上QPushButton的核心功能都是QAbstractButton提供的,自身属性比较少;
eg1.设置带有图标的按钮;
- 准备图标
- 创建qrc文件,并且将上述图标导进去;
- 编写代码,创建带有图标的按钮;
- 运行结果如下:
如果我们觉得,图标的大小太小了,那么我们可以通过setIconSize(const QSize&)接口来设置图标的大小:
eg2 .设置带快捷键的按钮
设计思路:在界面上主要有5个按钮控件,其中四个按钮控件为方向键,一个按钮控件为target目标控件,当我们使用鼠标点击或者快捷键操作这四个控件的时候,那么这个target目标控件将会跟随着被点击的控件所指的方向所移动;
- 导入图标的qrc文件:
- 通过图形化界面创建对应的图像,并且通过图形化界面的方式来为每个按钮设置图标:
- 设置对应的槽函数
- 设置快捷键
- 运行结果如下:
不仅可以通过鼠标点击的方式来实现坤坤的移动,同时也可以通过我们设置的"w"、“a”、“s”、"d"来进行操作,忽略大小写;
当然,我们除了上诉写法之外来设置快捷键,也可以通过下面的方式来进行设计:
也能是实现出快捷键的效果,同时,该方法在设计组合键的时候也比较方便,比如:现在我们就可以设计Ctrl+W来作为向上移动的快捷键:
这样设计过后,w、s、a、d快捷键就不起作用了,只有加上Ctrl才会有反应;
但是通过上面的使用,我们发现,当我们一直按下快捷键的时候,坤坤会一直移动,而当我们鼠标一直左键按在移动按钮上的时候坤坤没有移动,只有当我们松开了,坤坤才会移动一下,因此,我们需要开启按钮的鼠标持续事件属性:
经过我们的设置过后,我们发现现在鼠标一直按着方向键确实能使坤坤一直移动;
QRadioButton
QRadioButton是单选按钮,可以当我们在多个选项中选择一个;
作为QAbstractButton的子类上面介绍的属性同样也适用于QRadioButton;
QAbstractButton 中和 QRadioButton 关系较⼤的属性
属性 | 说明 |
---|---|
checkable | 是否能被选择;true表示能,false表示不能 |
checked | 检测是否被选中;该前提是checkable开启; |
autoExclusive | 是否排他,对于QRadioButton控件来说,他具有排他属性,也就是选中当前单选按钮过后,其它单选按钮会被取消选中状态,对于一个单选按钮来说默认是排他的 |
说了这么多,单选按钮长啥样?
我们来看看:
eg1 .选择性别
设计思路:
在界面上有4个控件,一个Label控件,用来显示一些文字;
3个RadioButton控件,一个表示男、一个表示女、一个表示保密
- 设计图如下:
- 设置对应的槽函数
- 运行结果:
当前的代码中程序启动的时候,什么也没有被选中,我们可以让程序的默认选项为男,因此我们的代码可以按照如下更改:
同理,我们也可以让保密选项无法被选中,这里主要有两种方式来实现:
①调用setEnabled直接禁用“其它”控件:
②调用setCheckable() 让这个控件本身无法被选中,这里的选中是说无法被打勾,但是可以被点击:
QAbstractButton的内置信号:
clicked(): 点击,即鼠标左键按下+松开就会触发该信号;
clicked(bool): 点击,即鼠标左键按下+松开会触发该信号,在触发该信号时,会将该控件是否被选中的状态也一并发送出去,对于QPushButton按钮来说没用,对于QRadioButton来说有用;
pressed(): 按下,即鼠标左键按下,就会触发该信号;
released(): 松开,即鼠标左键松开,就会触发该信号;
toggled(): 按钮状态切换了,就会发送该信号
接着,我们来分别演示一下这几个信号的用法和区别:
- clicked(bool)
运行结果:
- pressed、released
对于槽函数:
运行结果如下:
- toggled(bool)
当某个按钮状态发生变化过后,那么会触发toggled信号并且该信号会携带上当前按钮的选中状态;
运行结果:
eg2 .单选框分组
- 设计对应的图形界面:
- 运行:
我们发现,我们只能选择一个,我们选了汉堡,小食和饮料组的商品我们无法选择,对于其它也是同理;
这主要是因为,RadioButton按钮的排他性影响的,这里我们主要有两种解决方案:
①关闭RadioButton的排他性:
这样确实能解决问题,但是也会引发一个新问题,就是,虽然我接触了排他性了,但是对于同一组中的商品我也能同时选中了,比如:
这是不合理的,我们希望的是,同一组排他,而不同组之间不存在排他性!
②采用QButtonGroup分组排他;
我们使用QButtonGroup将同一组的商品放在一起,然后进行组内排他:
同时也不存在,组内也可以同时选择的情况;
QCheckBox
与QRadioButton单选按钮相对,只能选中一个;QCheckBox表示复选按钮,可以选中多个;
eg:
- 设计界面
- 设置对应的槽函数:
- 运行结果: