以下内容均是个人理解,不保证都是正确的,如有错欢迎指正
欢迎学习交流: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文件的代码