【QT(五)】—— 常用控件(二)

前言

这里所学习到的QPushButton、QRadioButton、QCheckButton以及QToolButton都继承于 QAbstractButton

QAbstractButton 类又继承于 QWidget类(QWidget类继承于QObject)。

无论是这里的按钮类控件,还是文本框QLabel控件都是 QWidget的子类。

按钮 QPushButton

对于 QPushButton,这个按钮之前都是简单的创建一个按钮,关联槽函数这些,现在来学习 QPushButton的常用属性:

1. 图标 Icon

属性 说明
icon 按钮中的图片
iconSize 按钮在图片的尺寸

对于QPushButton按钮,我们是可以设置图标的:

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon(":/icon.jpg");
    ui->pushButton->setIcon(icon);
    ui->pushButton->setIconSize(QSize(50,50));
}
  • setIcon的参数类型是 QIcon,在调用之前就要先创建一个QIcon对象并指的图片路径(qrc文件资源管理),可以创建匿名对象传参。
  • setIconSize的参数类型是 QSize,在调用时就要先构造一个QSize对象(长、宽)单位都是像素。

2. 快捷键 Shortcut

这里我们创建的按钮,都是通过鼠标点击来触发clicked信号;我们也可以设置对应的快捷键。

属性 说明
Shortcut 按钮对应的快捷键

在之前学习QWidgetgeometry属性时,写了一个实例:通过4按钮控制另一个控件的上下左右移动;是使用鼠标点击的

有了快捷键,我们就可以通过键盘按键来触发信号,使用通过键盘来控制某一个控件的移动。

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon(":/1.jpg");
    ui->pushButton->setIcon(icon);
    ui->pushButton->setIconSize(QSize(50,50));
    // 设置快捷键
    ui->pushButton_up->setShortcut(Qt::Key_W);
    ui->pushButton_down->setShortcut(Qt::Key_S);
    ui->pushButton_left->setShortcut(Qt::Key_A);
    ui->pushButton_right->setShortcut(Qt::Key_D);

}
void Widget::on_pushButton_up_clicked()
{
    QRect rect = ui->pushButton->geometry();
    qDebug() << rect;
    ui->pushButton->setGeometry(rect.x(),rect.y() - 10, rect.width(), rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton->geometry();
    qDebug() << rect;
    ui->pushButton->setGeometry(rect.x(),rect.y() + 10, rect.width(), rect.height());
}
void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton->geometry();
    qDebug() << rect;
    ui->pushButton->setGeometry(rect.x() - 10, rect.y(), rect.width(), rect.height());
}
void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton->geometry();
    qDebug() << rect;
    ui->pushButton->setGeometry(rect.x() + 10, rect.y(), rect.width(), rect.height());
}

这里设置快捷键也可以使用字符串,例如:"W"、"S"、"A"、"D"

当需要设置组合快捷键时,可以使用 Qt::Key_W + Qt::Key_Tab,也可以使用字符串:"W + Tab"

3. 连续触发 AutoRepeat

在上述的例子中,运行我们可以发现,按住W键不放,上面控件是可以一直向上移动的,通过输出信息也会发现:Clicked信号在一直触发;而使用鼠标点击,按住不放,只会移动一次。

属性 属性
autoRepeat 是否重复重复,如果为true,表示会连续触发;false表示不会连续触发
autoRepeatDelay 重复触发的延时时间. 按住按钮多久之后, 开始重复触发
autoRepeatInterval 重复触发的周期

对于这个属性,了解一下即可,这里就设置控件为连续触发,这样鼠标按住不放也会一直触发clicked信号。

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon(":/1.jpg");
    ui->pushButton->setIcon(icon);
    ui->pushButton->setIconSize(QSize(50,50));
    // 设置快捷键
//    ui->pushButton_up->setShortcut(Qt::Key_W + Qt::Key_Tab);
    ui->pushButton_up->setShortcut(Qt::Key_W);
    ui->pushButton_down->setShortcut(Qt::Key_S);
    ui->pushButton_left->setShortcut(Qt::Key_A);
    ui->pushButton_right->setShortcut(Qt::Key_D);
    // 设置连续触发
    ui->pushButton_up->setAutoRepeat(true);
    ui->pushButton_down->setAutoRepeat(true);
    ui->pushButton_left->setAutoRepeat(true);
    ui->pushButton_right->setAutoRepeat(true);

}

单选按钮 QRadioButton

QRadioButton 是一个单选按钮,可以让我们在多个选项中选择其中的一个。

属性 说明
checkable 是否可以被选中
checked 是否被选中
autoExcluSive 是否排他(选择一个会取消另一个)

这里checkable的作用只是不能被选中,和Eabled不同的是:

  • checkablefalse时,点击按钮也会触发clicked信号
  • Enabledfalse时,按钮不能被点击(按钮图标变灰色,无法点击)

示例:简单实现一个点单程序

在选择完成点击选好了按钮后,更新文本,显示出选择的主食、菜品、饮品

cpp 复制代码
void Widget::on_pushButton_clicked()
{
    QString str = "你的选择是 : ";
    if(ui->radioButton_1->isChecked())
           str += ui->radioButton_1->text() + " ";
    if(ui->radioButton_2->isChecked())
           str += ui->radioButton_2->text() + " ";
    if(ui->radioButton_3->isChecked())
           str += ui->radioButton_3->text() + " ";
    if(ui->radioButton_4->isChecked())
           str += ui->radioButton_4->text() + " ";
    if(ui->radioButton_5->isChecked())
           str += ui->radioButton_5->text() + " ";
    if(ui->radioButton_6->isChecked())
           str += ui->radioButton_6->text() + " ";
    if(ui->radioButton_7->isChecked())
           str += ui->radioButton_7->text() + " ";
    if(ui->radioButton_8->isChecked())
           str += ui->radioButton_8->text() + " ";
    if(ui->radioButton_9->isChecked())
           str += ui->radioButton_9->text() + " ";
    ui->label->setText(str);
}

这里,除了点击选择,也可以通过代码,来设置按的选中状态。

分组 QButtonGroup

写了上述代码,我们会发现:点击一个按钮时,会自动取消另外的一个按钮;也就是在9个单选按钮中,只能选择一个。

要对单选按钮进行分组,这里就要用到 QButtonGroup

预期的效果是:主食里选择一个,菜品里选择一个、饮品里选择一个;

所以就要使用 QButtonGroup 讲这些按钮分为三组:

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
//    QButtonGroup group1;
    QButtonGroup* group1 = new QButtonGroup(this);
    group1->addButton(ui->radioButton_1);
    group1->addButton(ui->radioButton_2);
    group1->addButton(ui->radioButton_3);

//    QButtonGroup group2;
    QButtonGroup* group2 = new QButtonGroup(this);
    group2->addButton(ui->radioButton_4);
    group2->addButton(ui->radioButton_5);
    group2->addButton(ui->radioButton_6);

//    QButtonGroup group3;
    QButtonGroup* group3 = new QButtonGroup(this);
    group3->addButton(ui->radioButton_7);
    group3->addButton(ui->radioButton_8);
    group3->addButton(ui->radioButton_9);
}

注意:

为了保证分组的有效性,这里要在堆上创建 QButtonGroup对象。

按钮相关信号

对于按钮相关的信号,除了Clicked还有很多:

  • clicked : 点击产生信号
  • clicked(bool) :点击产生信号,参数表示当前是否被选中
  • pressed :按下产生信号
  • released : 松开产生信号
  • toggled : 状态改变产生信号

复选按钮 QCheckBox

对于 QRadioButtn 单选,只能在一组中选择一个;

而复选按钮,QCheckBox,就可以同时选择多个。

示例:选择爱好/喜欢的游戏

当然,也可以加上一个按钮,选择完成后,点击按钮来显示选择的爱好。

cpp 复制代码
void Widget::on_pushButton_clicked()
{
    QString str = "你的爱好是 : ";
    if(ui->checkBox_1->isChecked())
        str += ui->checkBox_1->text() + " ";
    if(ui->checkBox_2->isChecked())
        str += ui->checkBox_2->text() + " ";
    if(ui->checkBox_3->isChecked())
        str += ui->checkBox_3->text() + " ";
    if(ui->checkBox_4->isChecked())
        str += ui->checkBox_4->text() + " ";
    ui->label->setText(str);
    qDebug() << str;
}

本篇文章到这里就结束了,感谢支持

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

相关推荐
.小墨迹2 小时前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
wanghowie2 小时前
01.02 Java基础篇|核心数据结构速查
java·开发语言·数据结构
|晴 天|2 小时前
前端闭包:从概念到实战,解锁JavaScript高级技能
开发语言·前端·javascript
点云SLAM2 小时前
C++ error C2065: “M_PI”: 未声明的标识符 解决方案
开发语言·c++·error c2065·m_pi未声明 解决方案
qq_336313932 小时前
java基础-stream流练习
java·开发语言·python
草莓熊Lotso2 小时前
C++11 核心精髓:类新功能、lambda与包装器实战
开发语言·c++·人工智能·经验分享·后端·nginx·asp.net
黎雁·泠崖2 小时前
【C语言指针精讲】从内存到运算,吃透指针核心逻辑
c语言·开发语言
秦苒&2 小时前
【C语言指针四】数组指针变量、二维数组传参本质、函数指针变量、函数指针数组
c语言·开发语言·c++·c#
秋雨雁南飞2 小时前
C# 字符串占位
开发语言·c#