8.31 QTday2作业

优化登录界面,当点击登录按钮后,在该按钮对应的槽函数中,判断账户和密码框内的数据是否为admin和123456,如果账户密码匹配成功,则提示登录成功并跳转到另一个界面,关闭登录界面,如果账户和密码匹配失败,则提示登录失败,并将密码框中的内容清空。

当点击取消按钮后,则关闭整个登录界面

要求:对登录按钮使用QT5版本的连接,对取消按钮使用qt4版本的连接

头文件

//*************************第一个界面的头文件***********************
#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include    //标签类
#include 
#include 
#include 

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 

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 

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、思维导图

你可能感兴趣的:(命令模式)