Qt学习第二天:登录界面与窗口跳转

Qt学习第二天:登录界面与窗口跳转-CSDN博客

1:完成登录界面的效果

头文件 widget.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QDebug>
#include <QGridLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QLabel* label_username;
QLabel* label_passward;

QLineEdit* edit_username;
QLineEdit* edit_passward;

QPushButton* button;
QGridLayout* grid_layout;
};
#endif // WIDGET_H

源文件 widget.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "widget.h"
#include "ui_widget.h"

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

// 设置窗口的初始大小为500x400
this->resize(500, 400);

// 实例化标签
label_username = new QLabel("Username:", this);
// 设置标签内字体大小
label_username->setStyleSheet("font:35px");
// 设置标签内文本信息的对齐方式
label_username->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

label_passward = new QLabel("Passward:", this);
label_passward->setStyleSheet("font:35px");
label_passward->setAlignment(Qt::AlignRight | Qt::AlignVCenter);

// 实例化行编辑 QLineEdit
edit_username = new QLineEdit(this);
// 返回当前的尺寸策略并打印
qDebug() << edit_username->sizePolicy();
// 设置尺寸策略,水平方向为最小扩展,垂直方向为固定值
edit_username->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
// 设置控件的最小尺寸
edit_username->setMinimumHeight(75);
edit_username->setMinimumWidth(350);
edit_username->setStyleSheet("font:40px");

edit_passward = new QLineEdit(this);
edit_passward->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
edit_passward->setMinimumSize(350, 75);
edit_passward->setStyleSheet("font:40px");

button = new QPushButton("Log in", this);
button->setStyleSheet("font:35px");
button->setMinimumHeight(75);

// 实例化栅格布局
grid_layout = new QGridLayout(this);
// 给布局添加组件,并设置组件在几行几列,第4和第5个整型参数,代表设置组件扩展几行几列
grid_layout->addWidget(label_username, 0, 0);
grid_layout->addWidget(label_passward, 1, 0);
grid_layout->addWidget(edit_username, 0, 1);
grid_layout->addWidget(edit_passward, 1, 1);
grid_layout->addWidget(button, 2, 0, 1, 2);

// 设置布局中,列之间的比例关系
// 当前的比例关系为第0列和第1列的比例关系为1比5
grid_layout->setColumnStretch(0, 1);
grid_layout->setColumnStretch(1, 5);
}

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

2:判断用户名和密码,如果登录成功,则跳转到一个新的窗口。

进行判断之前,理应先连接按钮的信号和槽。

在widget.h下槽函数的声明:

1
2
private slots:
void buttonSlot();

在widget.cpp下信号和槽的连接代码:

1
connect(button, SIGNAL(clicked()),this, SLOT(buttonSlot()));
1
2
3
4
void Widget::buttonSlot()
{
// 判断需要登录成功的逻辑。
}

想要判断用户名和密码,就需要获取用户名和密码的信息。
我们输入的数据是存放在组件lineEdit上的,可以利用该组件的text()方法返回存储的字符串,以QString的形式返回。

1
2
QString username = edit_username->text();
QString passward = edit_passward->text();

获取到字符串之后,再用if判断用户名和密码是否正确。
QString和C++的string功能类似,也可以用运算符对其进行操作,比如==

需要跳转到一个新的窗口,需要新的窗口对象才能事先。
当前的窗口是在main函数里的w对象实例化出来的,我们也可以用类似的方式生成一个新的窗口。
w对象所属的类是Widget,之所以Widget具备窗口的能力,完全是因为其继承了他的基类QWidget

所以,需要一个新的窗口,也可以用QWidget进行。
widget.h定义

1
Widget *new_w;

widget.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Widget::buttonSlot()
{
QString username = edit_username->text();
QString passward = edit_passward->text();
qDebug() << "username:" << username;
qDebug() << "passward:" << passward;
if(username == "yeyu" && passward == "123")
{
qDebug() << "log in scucess";
new_w = new QWidget;
new_w->resize(300, 300);
new_w->show();
this->close();
}
else
{
qDebug() << "log in fail";
}
}

3:在新窗口下,点击return按钮可以返回到旧的窗口

新窗口里需要添加新的按钮组件,再使用QWidget作为窗口的类会比较麻烦,可以创建一个新类,去继承QWidget来代表新的窗口类。新建新类的方法采用新建Qt的设计师界面完成。新类的名称可以取名为NewWidget

来到新类的设计师界面,就可以对新窗口进行设置了,新窗口下的按钮也需要新的槽函数。这里采用转到槽的方式实现。

在新类的头文件里,添加手写的信号returnSignal()
手写信号的写法与函数声明一致。
手写的信号需要将返回值类型写为void,并且信号不可以有函数定义。

newwidget.h

1
2
signals:
void returnSignal();

新类的源文件中,在点击按钮的槽函数下,使用emit关键字手动发送信号即可。

newwidget.cpp

1
2
3
4
void NewWidget::on_pushButton_clicked()
{
emit returnSignal();
}

紧接着,真正返回的逻辑,应该回到旧窗口里实现。
在实例化新窗口之后,就应该编写信号和槽连接返回的逻辑。
widget.cpp

1
2
3
4
5
void Widget::returnSlot()
{
new_w->close();
this->show();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Widget::buttonSlot()
{
QString username = edit_username->text();
QString passward = edit_passward->text();
qDebug() << "username:" << username;
qDebug() << "passward:" << passward;

if(username == "yeyu" && passward == "123")
{
qDebug() << "log in scucess";
new_w = new NewWidget;
//信号和槽的连接代码
connect(new_w, SIGNAL(returnSignal()),this, SLOT(returnSlot()));
new_w->resize(300, 300);
new_w->show();
this->hide();
}
else
{
qDebug() << "log in fail";
}
}

这样这俩个界面就可以来回跳转了


Qt学习第二天:登录界面与窗口跳转
https://leaf-domain.gitee.io/2024/01/05/qt2/
作者
叶域
发布于
2024年1月5日
许可协议