常用界面设计组件 —— 按钮组件、布局组件

news2024/11/25 16:41:02

    • 2.4 按钮组件
    • 2.5 布局组件

2.4 按钮组件

QPushButton、QRadioButton 、QCheckBox都从 QAbstractButton,拥有一些共同的属性,如下图所 示:

在这里插入图片描述

图标使用setIcon()来设置,文本可以在构造函数或通过 setText()来设置。 可以使用 isChecked() 检查是否被选 中。

  • QPushButton

    QPushButton 是Qt常用的控件之一,提供普通的按 钮功能。 通过信号槽机制接收触发信号并执行对应 动作。

  • QRadioButton

    单选框默认开启自动互斥(autoExclusive)。如果 启用了自动互斥,属于同一个父部件的单选框的行为 就和属于一个互斥按钮组的一样。如果你需要为属于 同一父部件的单选框设置多个互斥按钮组,把它们加 入QButtonGroup中。

  • QCheckBox

    它也是一个可选择的按钮 , 常见用途是在要求用户 选择一个或多个可用选项的情况下。 与单选按钮不 同,默认情况下复选框不是互斥的。 checkBox按钮 可以通过在QButtonGroup对象中添加它们而互斥。 每当选中或清除复选框时,它都会发出信号状态 Changed()。如果要在每次复选框更改状态时触发操 作,请连接到此信号。您可以使用 isChecked() 查询 复选框是否被选中。

    注意:QCheckBox可以有两种状态,也可以有三种 状态(未选中,选中,半选),默认是两种状态。

    在这里插入图片描述

创建基于QMainWindow的工程,如下图所示:

在这里插入图片描述

对应的代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_ok_clicked()
{
    // 构建个人信息字符串
    QString info = "我是";
    if (ui->radioButton_man->isChecked()) {
        info += "男生";
    } else if (ui->radioButton_woman->isChecked()) {
        info += "女生";
    } else {
        info = "性别保密";
    }
    info += ", 我平时喜欢:";

    // 处理喜好复选框
    if (ui->checkBox_backeball->checkState()) {
        info += ui->checkBox_backeball->text();
        info += ",";
    }
    if (ui->checkBox_cartoon->checkState()) {
        info += ui->checkBox_cartoon->text();
        info += ",";
    }
    if (ui->checkBox_game->checkState()) {
        info += ui->checkBox_game->text();
        info += ",";
    }
    if (ui->checkBox_reading->checkState()) {
        info += ui->checkBox_reading->text();
        info += ",";
    }
    if (ui->checkBox_swim->checkState()) {
        info += ui->checkBox_swim->text();
        info += ",";
    }

    // 替换最后一个逗号为句号
    int pos = info.lastIndexOf(",");
    info.replace(pos, 1, ".");

    // 设置文本浏览器显示个人信息
    ui->textBrowser->setText(info);
}

void MainWindow::on_pushButton_clear_clicked()
{
    // 清除单选框和复选框的选择状态,并清空文本浏览器
    ui->radioButton_man->setAutoExclusive(false);
    ui->radioButton_man->setChecked(false);
    ui->radioButton_man->setAutoExclusive(true);

    ui->radioButton_woman->setAutoExclusive(false);
    ui->radioButton_woman->setChecked(false);
    ui->radioButton_woman->setAutoExclusive(true);

    ui->checkBox_backeball->setChecked(false);
    ui->checkBox_cartoon->setChecked(false);
    ui->checkBox_game->setChecked(false);
    ui->checkBox_reading->setChecked(false);
    ui->checkBox_swim->setChecked(false);

    ui->textBrowser->clear();
}

2.5 布局组件

Qt 的界面设计使用了布局(Layout)功能。所谓布局, 就是界面上组件的排列方式,使用布局可以使组件有规 则地分布,并且随着窗体大小变化自动地调整大小和相 对位置。

Qt提供了QHBoxLayout类(水平排列布局), QVBoxLayout类(垂直排列布局),QGridLayout类(网格 排列布局)等基本布局管理。它们之间的继承关系如下图 所示。

在这里插入图片描述

在designer软件界面中我们可以看到:
在这里插入图片描述

每个组件的作用如下表所示。

在这里插入图片描述

addWidget()方法用于向布局中加入组件。

addLayout()方法用于向布局中加入子布局 。

LeftLayout = new QGridLayout(); //由于LeftLayout布局管理器不是主布局管理器,所以不用指定父窗口
QGridLayout *mainLayout = new QGridLayout(this); //mainLayout实现主布局,所有要指定父窗口
//QHBoxLayout默认采取的是以自左向右的方式顺序排列插入控件或子布局,也可以通过setDirection()方法设定排列的顺序
TopRightLayout->setDirection(QBoxLayout::RightToLeft);
//QHBoxLayout是水平布局,可以设定水平各个控件之间的间距
TopRightLayout = new QHBoxLayout();
TopRightLayout->setSpacing(20); //设定各个控件之间的间距为20

布局如下窗口:

在这里插入图片描述

代码方式:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QRadioButton>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    // 初始化标签
    void initLabel();

    // 初始化输入框
    void initLineEdit();

    // 初始化布局
    void initLayout();

    // 初始化按钮
    void initBtn();

protected:
    // 标签
    QLabel *nameLabel;
    QLabel *ageLabel;
    QLabel *emailLabel;
    QLabel *numLabel;
    QLabel *sexLabel;

    // 输入框
    QLineEdit *ageLineEdit;
    QLineEdit *nameLineEdit;
    QLineEdit *emailLineEdit;
    QLineEdit *numLineEdit;

    // 单选按钮
    QRadioButton *mBtn;
    QRadioButton *wBtn;

    QPushButton *okBtn;
};

#endif // WIDGET_H
#include "widget.h"
#include <QFormLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 构造函数里逐个调用
    this->initBtn();
    this->initLabel();
    this->initLineEdit();
    this->initLayout();
}

Widget::~Widget()
{
}

void Widget::initLabel()
{
    this->nameLabel = new QLabel("姓名:(&N)");
    this->ageLabel = new QLabel("年龄:(&A)");
    this->emailLabel = new QLabel("邮箱:(&E)");
    this->numLabel = new QLabel("电话号码:(&N)");
    this->sexLabel = new QLabel("性别");
}

void Widget::initLineEdit()
{
    this->nameLineEdit = new QLineEdit;
    this->ageLineEdit = new QLineEdit;
    this->emailLineEdit = new QLineEdit;
    this->numLineEdit = new QLineEdit;
}

// 初始化布局
void Widget::initLayout()
{
    nameLabel->setBuddy(nameLineEdit);
    ageLabel->setBuddy(ageLineEdit);
    emailLabel->setBuddy(emailLineEdit);

    // 创建一个表格类布局
    QFormLayout *headerLayout = new QFormLayout;
    headerLayout->addRow(nameLabel, nameLineEdit);
    headerLayout->addRow(ageLabel, ageLineEdit);
    headerLayout->addRow(emailLabel, emailLineEdit);
    headerLayout->addRow(numLabel, numLineEdit);

    // 创建水平布局类,意思是横线方向的布局
    QHBoxLayout *sexLayout = new QHBoxLayout;
    sexLayout->addWidget(sexLabel);
    sexLayout->addWidget(mBtn);
    sexLayout->addWidget(wBtn);

    // 空隙
    QSpacerItem *vSpacer = new QSpacerItem(30, 30);
    QSpacerItem *hSpacer = new QSpacerItem(150, 20);

    // 创建水平布局
    QHBoxLayout *okLayout = new QHBoxLayout;
    // 把上面创建的空隙先添加进来
    okLayout->addItem(hSpacer);
    // 把按钮添加到布局
    okLayout->addWidget(okBtn);

    // 创建一个垂直布局,作为主布局,把之前创建的布局都添加到这个布局中
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(headerLayout);
    mainLayout->addLayout(sexLayout);
    mainLayout->addItem(vSpacer);
    mainLayout->addLayout(okLayout);
    mainLayout->setMargin(50);
    mainLayout->setSpacing(10);

    // 把垂直布局设置为当前界面的
    this->setLayout(mainLayout);
}

void Widget::initBtn()
{
    this->mBtn = new QRadioButton("男");
    this->wBtn = new QRadioButton("女");
    this->okBtn = new QPushButton("确定");
}

可视化方式:

第一步:

第二步
在这里插入图片描述

第三步:

在这里插入图片描述

第四步:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring第一天

学习目标 能够说出Spring的体系结构 能够编写IOC入门案例 能够编写DI入门案例 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spri…

【数据结构】从顺序表到ArrayList类

文章目录 1.线性表1.1线性表的概念2.顺序表2.1顺序表的概念2.2顺序表的实现2.3接口的实现(对数组增删查改操作)3.ArrayList简介4. ArrayList使用 4.1ArrayList的构造4.2 ArrayList的方法4.3 ArrayList的遍历 1.线性表 1.1线性表的概念 线性表&#xff08;linear list&#xf…

VsCode容器开发 - VsCode连接远程服务器上的docker

VsCode容器开发 - VsCode连接远程服务器上的docker 前言 之前在服务器上的Docker内开发&#xff0c;文件编辑起来就很不爽。不如使用VsCode直接打开远程服务器上的Docker&#xff0c;这样就能在VsCode里直接无缝编辑Docker里的文件了。 但是百度和必应得到的中文结果都很奇葩…

【数学笔记】集合及简要逻辑

集合 基础简要逻辑集合间的关系与运算 基础 集合定义&#xff1a;把一些能够确定的不同对象组成的整体叫做一个集合&#xff0c;每个对象叫做元素。集合记法&#xff1a;一般用大写字母 A , B , C . . . . . . A,B,C...... A,B,C......表示集合&#xff0c;小写字母 a , b ,…

Python __repr__()方法:显示属性

先看下面程序&#xff1a; class Item:def __init__ (self, name, price):self.name nameself.price price # 创建一个Item对象&#xff0c;将之赋给im变量 im Item(鼠标, 29.8) # 打印im所引用的Item对象 print(im) 上面程序创建了一个 Item 对象&#xff0c;然后使用 prin…

Linux中NFS服务器的搭建和安装

1.介绍&#xff1a; 网络文件系统即将本地系统放在网络上某一个位置的系统&#xff0c;基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享&#xff0c;能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样&#xff0c;也就是说放在一个开发板上&#…

8.Gateway服务网关

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

python random.randint方法底层分析及其逆向

本文主要解释了python random模块中的randint方法的底层原理&#xff0c;并做了简单的逆向&#xff0c;能还原出所使用的随机数的部分&#xff0c;这在对random模块逆向的时候会有一些帮助。 文章目录 random模块底层原理概述randint分析逆向 random模块底层原理概述 python的…

C++版QT:鼠标事件

鼠标常用的事件可以说有一下几种&#xff1a;鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。 当你想使用他们&#xff0c;需要包含头文件&#xff1a;#include <QMouseEvent> 需要对鼠标事件进行处理时&#xff0c;通常要重新实现以下几个鼠标事件处理函数&a…

一文教你写出高效的软件测试用例!微信朋友圈动态发送为例

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

单元测试报Command line is too long. Shorten command line for XXXXX.XXX

文章目录 前言单元测试报Command line is too long. Shorten command line for XXXXX.XXX1. 问题原因:2. 解决方案 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的…

Android Dialog 显示不全的问题

前言&#xff1a;开发的时候发现一些运行到手机里的dialog显示不全&#xff0c;只显示一半左右 问了下chatgpt发现没有任何头绪&#xff0c;于是开始自己慢慢分析 显示去掉了原有的dialog的style发现问题解决了&#xff0c;但在原有基础上如何解决呢&#xff1f; 先看看xml&a…

【LeetCode】每日一题 2024_1_20 按分隔符拆分字符串(模拟/库函数)

文章目录 随便聊聊时间题目&#xff1a;按分隔符拆分字符串题目描述代码与解题思路 随便聊聊时间 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔半个月&#xff0c;LeetCode 每日一题重新开张&#xff0c;寒假学习&#xff0c;正式开始 题目&#xff1…

盖子的c++小课堂:第二十六讲:双向链表

前言 谢谢各位粉丝的支持,望我早日突破1000粉 双向链表 干货!单链表从原理到实现——附python和C++两个版本 - 知乎单链表是链表家族中的一员,每个节点依旧由 数据域(data)和指针域(next)组成,链表的具体概念下面有介绍: 机器学习入坑者:程序员基本功——链表的基…

一天吃透消息队列面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 为什么要使用消息队列&#xff1f; 总结一下&#xff0c;主要三点原因&#xff1a;解耦、异步、削峰。 1、解耦。比如&#xff0c;用户下单后&#xff0c;订单系统需要通知库存系统&#xff0c;假如库存系统无法访问&#xff0…

【电机控制】PMSM无感FOC控制(九)无感启动

0. 前言 终于到了FOC无感入门的最后被一个章节了&#xff0c;无感foc的启动其实很好理解&#xff0c;分为三个阶段&#xff1a;转子定位、I/F强拖、电流转速双闭环。 1. 无感foc启动 &#xff08;1&#xff09;转子定位阶段&#xff1a; 首先将q轴电流设定一个能将转子拖动的值…

U-Mamba: Enhancing Long-range Dependency for Biomedical Image Segmentation

Abstract 卷积神经网络(Convolutional Neural Networks, cnn)和transformer是生物医学图像分割中最流行的架构&#xff0c;但由于固有的局部性或计算复杂性&#xff0c;它们处理远程依赖关系的能力有限。为了解决这一挑战&#xff0c;我们引入了U-Mamba&#xff0c;一个通用的…

IO详解(二)字符流

字符流 FileReader //创建一个文件字符输入流管道与源文件接通 Reader fr new FileReader("D:\\resource\\a.txt");//覆盖管道 Reader fr new FileReader("D:\\resource\\a.txt",true);//追加管道 int c fr.read();---char[] buffer new char[1024]; …

力扣hot100 环形链表 快慢指针 计步器

Problem: 141. 环形链表 文章目录 思路&#x1f496; 快慢指针法&#x1f496; 计步器法 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f496; 快慢指针法 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) /*** Definition for singly-linked list…

IP地址组成

一、简介 ​ IP地址由四段组成&#xff0c;每个字段是一个字节&#xff0c;即4个字节、 每个字节有8位&#xff0c;最大值是255(256&#xff1a;0~255)&#xff0c;是全世界范围是唯一的 32 位&#xff08;4个字节 * 8位&#xff09;的标识符。 ​ IP地址由两部分组成&#x…