优化登录界面,当点击登录按钮后,在该按钮对应的槽函数中,判断账户和密码框内的数据是否为admin和123456,如果账户密码匹配成功,则提示登录成功并跳转到另一个界面,关闭登录界面,如果账户和密码匹配失败,则提示登录失败,并将密码框中的内容清空。
当点击取消按钮后,则关闭整个登录界面
要求:对登录按钮使用QT5版本的连接,对取消按钮使用qt4版本的连接
头文件
//*************************第一个界面的头文件***********************
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QIcon>
#include <QLabel> //标签类
#include <QDebug>
#include <QPushButton>
#include <QLineEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
signals:
void my_signal();
public slots:
void my_slot(); //处理登录按钮对应的槽函数
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QLabel *lab1;
QLabel *lab2;
QLabel *lab3;
QLineEdit *edit1;
QLineEdit *edit2;
QPushButton *btn1;
QPushButton *btn2;
};
#endif // WIDGET_H
//******************************************第二个界面的头文件****************
#ifndef SECOND_H
#define SECOND_H
#include <QWidget>
namespace Ui {
class Second;
}
class Second : public QWidget
{
Q_OBJECT
public slots:
void my_slot();
public:
explicit Second(QWidget *parent = nullptr);
~Second();
private:
Ui::Second *ui;
};
#endif // SECOND_H
主函数
#include "widget.h"
#include "second.h" //引入第二个界面的头文件
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
Second s;
QObject::connect(&w, &Widget::my_signal, &s, &Second::my_slot);//因为main中没有connect函
数,且connect是一个静态函数,
//所以可以不实例化对象直接写
其所属的类+::
//当然也可以用实例化对象调用
connect函数
return a.exec();
}
第一个和第二个的.cpp
//***************************第一个界面的.cpp****************************
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置固定尺寸
this->setFixedSize(480,440);
//设置窗口标题
this->setWindowTitle("鹏哥快聊");
//设置窗口icon
this->setWindowIcon(QIcon("E:\\QT\\icon\\wodepeizhenshi.png"));
//实例化一个标签1
lab1 = new QLabel(this);
lab1->resize(QSize(480,180));
lab1->setPixmap(QPixmap("E:\\QT\\icon\\logo.png"));
lab1->setScaledContents(true); //设置内容自适应,默认false
//实例化标签2
lab2 = new QLabel(this);
lab2->resize(QSize(40,35));
lab2->move(100, 230);
lab2->setPixmap(QPixmap("E:\\QT\\icon\\userName.jpg"));
lab2->setScaledContents(true); //设置内容自适应,默认false
//构造行编辑器1
edit1 = new QLineEdit(this);
edit1->setPlaceholderText("QQ号码/手机/邮箱"); //设置编辑器的占位符
edit1->resize(QSize(220,40));
edit1->move(lab2->x()+80,lab2->y());
//实例化标签3
lab3 = new QLabel(this);
lab3->resize(lab2->size());
lab3->move(lab2->x(),lab2->y()+75);
lab3->setPixmap(QPixmap("E:\\QT\\icon\\passwd.jpg"));
lab3->setScaledContents(true);
//构造行编辑器2
edit2 = new QLineEdit(this);
edit2->setPlaceholderText("密码"); //设置编辑器的占位符
edit2->resize(edit1->size());
edit2->move(edit1->x(),lab3->y());
edit2->setEchoMode(QLineEdit::Password); //设置回显模式
//插入登录按钮
btn1 = new QPushButton(QIcon("E:\\QT\\icon\\login.png"),"登录",this);
btn1->move(240, 380);
btn1->resize(90,40);
//使用qt5版本的连接,将登录按钮连接到对应的槽函数中
connect(btn1, &QPushButton::clicked,this, &Widget::my_slot);
//插入取消按钮
btn2 = new QPushButton(QIcon("E:\\QT\\icon\\cancel.png"),"取消",this);
btn2->move(btn1->x()+110,btn1->y());
btn2->resize(btn1->size());
connect(btn2,SIGNAL(clicked()),this,SLOT(close()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::my_slot()
{
//获取用户名和密码
//QString userName = edit1.text();
//QString passwd = edit2.text();
if(edit1->text()=="admin" && edit2->text() == "123456")
{
qDebug()<<"登陆成功";
emit my_signal();
this->close();
}
else
{
qDebug()<<"登陆失败";
edit2->clear();
}
}
//*************************第二个界面的.cpp*******************************
#include "second.h"
#include "ui_second.h"
Second::Second(QWidget *parent) :
QWidget(parent),
ui(new Ui::Second)
{
ui->setupUi(this);
}
Second::~Second()
{
delete ui;
}
void Second::my_slot()
{
this->show();
}
2 、面试题
1、多态、虚函数、纯虚函数?
答:多态分为静态多态和动态多态,静态多态有函数重载、运算符重载,函数重载表示在同一作用域下,相同函数名,不同参数列表实现不同的功能,运算符重载表示为对运算符的重新构建从而实现更多复杂的功能。动态多态表示为父类的指针或引用,指向或初始化子类的对象,调用子类对父类重写的函数,进而展开子类的功能。
首先动态多态的运行存在许多前提条件,第一点是必须有继承关系,因为动态多态发生在父子类之间。第二点是子类和父类有他们同名同类型的函数,只有子类中有与父类同名同类型的函数时才能实现对函数的重写,第三点是父类被重写的函数必须为虚函数。
虚函数,用virtual修饰的函数即为虚函数,当类中存在虚函数,那么该类中就会有一个虚指针,虚指针指向虚函数表,虚函数表中记录了所有虚函数以及子类对父类重写的函数。
当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。
2、将“引用”作为函数参数有哪些特点?
答:函数参数是程序间数据交互的桥梁,一般分为值传递和地址传递。值传递,传递的是值,不改变值原本的大小。地址传递,传递的是地址,当通过地址访问到其地址所指向的内容时,其内容可以发生改变。引用的实质为取别名,一旦确定指向不能更改。使用引用作为函数参数时,不需要重新开辟空间,效率高,通过引用可直接改变其对应的内容。当引用不想被改变的变量时,可使用const修饰,此时为常引用,常引用不能修改值的大小。
3、结构体和联合体有何区别?
答:结构体与联合体都是构造数据类型,都是由相同或不同的数据类型构造而成。但是结构体每个成员地址连续,结构体大小由每个成员的字节大小字节对齐原则决定。而联合体大小由其成员中字节最大的决定,所有成员共用一片空间。
3、思维导图