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.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);
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);
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); 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);
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定义
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"; } }
|
这样这俩个界面就可以来回跳转了
