QT学习笔记二之布局管理器、信号与槽函数

以下内容均是个人理解,不保证都是正确的,如有错欢迎指正
欢迎学习交流:815030927@qq.com

一、布局管理器

1、QT中的布局有两种:

第一种是固定布局,窗口中的组件大小和位置固定,不会随窗口的变化而变化
第二种是用布局管理器,窗口中的组件大小和位置会随着窗口的变化而变化

2、QT布局管理器中的类及类的继承关系

在这里插入图片描述常用的布局管理器有水平布局管理器、垂直布局管理器、栅格布局管理器和form(form的布局特点是两列多行)

3、在图形界面中,布局管理器的位置在:

在这里插入图片描述

4、在图形界面中使用和取消布局管理器的方法

使用:选择要添加到布局管理器的控件,点击3中所示的布局管理器的位置
取消:选中要取消的布局管理器,点击3中取消布局管理器的位置

5、用代码实现布局管理器

先看效果图
在这里插入图片描述
①在创建项目时选择不要创建ui界面
②在.h文件中添加以下代码

	QLabel *TitleLabel, *IdLabel, *PwdLabel;
    QLineEdit *IdEdit, *PwdEdit;
    QPushButton *LoginBt, *RegisterBt;
    QHBoxLayout *hbox1, *hbox2, *hbox3;
    QVBoxLayout *vbox1;

③在.cpp文件(不是main.cpp)的构造函数中添加以下代码:

//标题标签
    TitleLabel = new QLabel(this);
    QFont ft;
    ft.setPointSize(36);//设置字体大小
    TitleLabel->setFont(ft);
    TitleLabel->setAlignment(Qt::AlignHCenter);//设置文字对其方式
    TitleLabel->setText("欢迎登录xx系统");
    //账号标签
    IdLabel = new QLabel(this);
    ft.setPointSize(20);
    TitleLabel->setFont(ft);
    TitleLabel->setAlignment(Qt::AlignHCenter);
    IdLabel->setText("账号");
    //密码标签
    PwdLabel = new QLabel(this);
    ft.setPointSize(20);
    TitleLabel->setAlignment(Qt::AlignHCenter);
    PwdLabel->setText("密码");
    //账号输入框
    IdEdit = new QLineEdit(this);
    IdEdit->setPlaceholderText("请输入账号");
    //密码输入框
    PwdEdit = new QLineEdit(this);
    PwdEdit->setPlaceholderText("请输入密码");
    PwdEdit->setEchoMode(QLineEdit::Password);

    //注册按钮
    RegisterBt = new QPushButton();
    RegisterBt->setText("注册");
    //登录按钮
    LoginBt = new QPushButton();
    LoginBt->setText("登录");

    /*注意:通过代码使用布局管理器需要按照
      从先到后的顺序往布局管理器内添加内容
    (参考下面vbox1注释)*/

    //创建外层的布局管理器
    vbox1 = new QVBoxLayout(this);
    //账号标签与输入框布局管理器
    hbox1 = new QHBoxLayout();
    //密码标签与输入框布局管理器
    hbox2 = new QHBoxLayout();
    //注册与登录按钮布局管理器
    hbox3 = new QHBoxLayout();

    //垂直布局管理器中的内容从高到低分别是TitleLabel、hbox1、hbox2、hbox3
    vbox1->addWidget(TitleLabel);
    vbox1->addStretch();//添加可伸缩的“弹簧”
    vbox1->addLayout(hbox1);
    vbox1->addLayout(hbox2);
    vbox1->addStretch();
    vbox1->addLayout(hbox3);

    hbox1->addStretch();
    hbox1->addWidget(IdLabel);
    hbox1->addWidget(IdEdit);
    hbox1->addStretch();

    hbox2->addStretch();
    hbox2->addWidget(PwdLabel);
    hbox2->addWidget(PwdEdit);
    hbox2->addStretch();

    hbox3->addStretch();
    hbox3->addWidget(RegisterBt);
    hbox3->addWidget(LoginBt);
    hbox3->addStretch();

④在.cpp文件的析构函数中添加以下代码:

delete TitleLabel;
    delete IdLabel;
    delete PwdLabel;
    delete IdEdit;
    delete PwdEdit;
    delete RegisterBt;
    delete LoginBt;
    delete vbox1;
    delete hbox1;
    delete hbox2;
    delete hbox3;

二、信号与槽函数

1、介绍:

信号与槽函数是QT中特有的。对象与对象之间(或对象本身)通信的一种机制。

2、声明方式:

1)槽函数声明:

槽函数有两种声明方式

public/protected/private slots:
	myslots1();//槽函数声明后必须实现
	myslots2();

这种方式需要使用关联函数connect()进行关联
注: 关联函数connect调用方法:
connect(发送者地址,发送的信号,接收者地址,关联的槽函数)

②on_对象名_槽函数名()
这种方式是QT自动生成方式,发出信号直接调用,无需connect关联。这种方式引出的内容较多,文章后面会细讲。

2)信号声明
public/protected/private signals:
	mysignal1();//信号声明后无需实现
	mysignal2();

发送信号:

emit mysignal1();
mysigna2();//省略emit也可以,但是为了便于阅读还是加上比较好

注: QT中信号可以带参数,参数可以用槽函数来接。以前的QT版本中信号带参数,槽函数可以不带。

3、实例

在例子中我们实现
①点击关闭按钮关闭窗口
②点击显示按钮,将第一栏中 的内容复制到第二栏中。

功能简单但为了更好的理解,实例会复杂一点。将按钮的clicked信号与自定义的槽函数myslots1相关联,在槽函数myslots1中我们发送自定义信号mysignal,将信号mysignal与自定义槽函数myslots2关联,在槽函数myslots2中关闭窗口。功能②也是类似的操作

1)创建一个带界面的QT项目SignalSlots

在图形界面中添加如下组件,把右侧截出来是为了让大家看到组件名称
在这里插入图片描述

2)在signalslots.h文件中代码
#ifndef SIGNALSLOTS_H
#define SIGNALSLOTS_H

#include <QMainWindow>
#include <QString>
namespace Ui {
class SignalSlots;
}

class SignalSlots : public QMainWindow
{
    Q_OBJECT

public:
    explicit SignalSlots(QWidget *parent = nullptr);
    ~SignalSlots();
private slots:
    void myslots1();
    void myslots2();
    void myslots3();
    void myslots4(QString str);
        signals:
    void mysignal1();
    void mysignal2(QString str);
private:
    Ui::SignalSlots *ui;
};

#endif // SIGNALSLOTS_H
3)在signalslots.cpp文件中代码
#include "signalslots.h"
#include "ui_signalslots.h"

SignalSlots::SignalSlots(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SignalSlots)
{
    ui->setupUi(this);
    /*                      实现关闭窗口                          */
    //将clicked信号与myslots1关联
    connect(ui->closeBt, &QPushButton::clicked, this, &SignalSlots::myslots1);
    //将mysignal1信号与myslots2关联
    connect(this, &SignalSlots::mysignal1, this, &SignalSlots::myslots2);
    /*                       实现复制                       */
    //将clicked信号与myslots3关联
    connect(ui->copyBt, &QPushButton::clicked, this, &SignalSlots::myslots3);
    //将mysignal2信号与myslots4关联
    connect(this, &SignalSlots::mysignal2, this, &SignalSlots::myslots4);
}
void SignalSlots::myslots1()
{
    emit mysignal1();//发送信号
}
void SignalSlots::myslots2()
{
    this->close();//关闭窗口
}
void SignalSlots::myslots3()
{
    emit mysignal2(ui->lineEdit->text());
}

void SignalSlots::myslots4(QString str)
{
    ui->lineEdit_2->setText(str);
}
SignalSlots::~SignalSlots()
{
    delete ui;
}

4、在图形界面中使用槽函数的方法

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200218172902677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc5OTQ1Mg==,size_16,color_FFFFFF,t_70

5、QT中图形界面与代码操作上相关性不强的原因

在.cpp文件中按住ctrl键点击setupUi转到ui_signalslots.h文件
在这里插入图片描述ui_signalslots.h文件的代码
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值