QT Day1

1. Login interface

#include "widget.h"
#include "ui_widget.h"

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

    //固定窗口大小
    this->setFixedSize(600, 560);
    //设置窗口标题
    this->setWindowTitle("hello");
    //设置窗口图标
    this->setWindowIcon(QIcon("C:/Users/asus/Desktop/icon/wodepeizhenshi.png"));
    //有参构造一个标签,指定父组件,依附于此界面存在
    QLabel *lab1 = new QLabel(this);
    //设置大小
    lab1->resize(600, 250);
    //设置图片
    lab1->setPixmap(QPixmap("C:/Users/asus/Desktop/icon/logo.png"));
    //设置图片自适应
    lab1->setScaledContents(true);

    //有参构造一个标签,指定父组件
    QLabel *lab2 = new QLabel(this);
    //设置大小
    lab2->resize(30, 30);
    //设置图片
    lab2->setPixmap(QPixmap("C:/Users/asus/Desktop/icon/userName.jpg"));
    //设置图片自适应
    lab2->setScaledContents(true);
    //移动位置
    lab2->move(140, 320);

    //无参构造一个标签
    QLabel *lab3 = new QLabel();
    //设置指定父组件,依附此界面存在
    lab3->setParent(this);
    //设置大小
    lab3->resize(30, 30);
    //设置图片
    lab3->setPixmap(QPixmap("C:/Users/asus/Desktop/icon/passwd.jpg"));
    //设置图片自适应
    lab3->setScaledContents(true);
    //移动位置
    lab3->move(lab2->x(), lab2->y()+80);

    //无参构造一个行编辑器 QLineEdit
    QLineEdit *Edit1 = new QLineEdit();
    //指定父组件,让其依附于此界面存在
    Edit1->setParent(this);
    //设置大小
    Edit1->resize(240, 40);
    //设置背景色
    Edit1->setStyleSheet("background-color:white; border: 1px solid gray; padding: 10px;");
    //移动位置
    Edit1->move(lab2->x()+80, lab2->y()-10);
    //设置占位文本
    Edit1->setPlaceholderText("QQ/手机/邮箱");

    //有参构造一个行编辑器 QLineEdit
    QLineEdit *Edit2 = new QLineEdit(this);
    Edit2->resize(Edit1->size());
    //设置北京四
    Edit2->setStyleSheet("background-color:white; border: 1px solid gray; padding: 10px;");
    //移动位置
    Edit2->move(lab3->x()+80, lab3->y()-10);
    //设置文本位置
    Edit2->setPlaceholderText("密码");
    //设置回显模式
    Edit2->setEchoMode(QLineEdit::Password);

    //有参构造一个命令按钮,初始化文本内容,指定父组件 QPushButton
    QPushButton *btn1 = new QPushButton("登录", this);
    //设置大小
    btn1->resize(80, 40);
    //移动位置
    btn1->move(240, Edit2->y()+80);
    //设置图片
    btn1->setIcon(QIcon("C:/Users/asus/Desktop/icon/login.png"));

    //有参构造一个命令按钮,初始化图标和文本内容,指定父组件QPushButton
    QPushButton *btn2 = new QPushButton(QIcon("C:/Users/asus/Desktop/icon/cancel.png"), "取消", this);
    //设置大小
    btn2->resize(btn1->size());
    //移动位置
    btn2->move(btn1->x()+120, btn1->y());

}

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

2. Initial analysis of each file of the QT project

1. Configuration file.pro file

#QT工程所需要的类库,core:核心库 gui:图形化界面相关的库 sql:数据库 network:网络库
QT       += core gui

#版本超过4.0后,尾部自动添加widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

#该编译器支持c++11及后的版本
CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

#管理源文件
SOURCES += \
    main.cpp \
    widget.cpp

#管理头文件
HEADERS += \
    widget.h

#管理ui文件
FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2.Header file

#ifndef WIDGET_H     //防止被多次包含 ifndef WIDGET_H  #define WIDGET_H #endif结构
#define WIDGET_H

#include <QWidget>    //Qwidget类所在的头文件(类名就是头文件), 父类的头文件,图形化界面相关的类都是从Owidget类派生的

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }    //命名空间的声明,(class Widget时ui这个命名空间中里边的)
QT_END_NAMESPACE

class Widget : public QWidget    //封装widget类,公共继承与Owidget这个类
{
    Q_OBJECT     //信号和槽的元对象

public:
    Widget(QWidget *parent = nullptr);    //构造函数的声明,里边形参是一个默认参数,此时相当于是有参或无参构造函数
    ~Widget();    //析构函数的声明

private:
    Ui::Widget *ui;      //命名空间UI的类定义一个指针, 后期通过ui指针可以找到通过ui界面上拖拽出来的组件,
                        //内容是namespace Ui {
                                   //class Widget: public Ui_Widget {};     //公共继承于Ui_Widget{};
                              //} // namespace Ui
                       //通过Widget::widget的有参构造函数中调用setsetupUi(this)对通过ui界面上拖拽出来的组件进行实例化空间和初始化
                      //自己在类内定义出来的组件用this查找
};
#endif // WIDGET_H

3. Source file main.cpp

#include "widget.h"           //自己的weidget类的头文件

#include <QApplication>      //应用程序类的头文件

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);      //实例化一个应用程序类对象a,调用有参构造函数
    Widget w;                       //实例化Widget对象w,调用无参构造函数
    w.show();                      //调用show函数,展示图形化界面,该函数是父类提供的(继承下来),可以展示本身组件和依附在此组件的所有的组件
    return a.exec();              // 应用程序对象a调用exec()函数,来阻塞界面不被关闭,等待相关事件发生
                                 //等待信号与槽, 事件处理,用户操作等
}

4. Source file: custom class name.cpp

#include "widget.h"    //自己的类的头文件,这个名字是自己起的
#include "ui_widget.h"  //ui图形化界面的头文件

Widget::Widget(QWidget *parent)    //widget(自己的类)的有参/无参构造函数的定义, 因为这个(组件)界面不依附其他父组件,所有在构造函数声明时默认值是nullptr
    : QWidget(parent)              //显性调用父类中的有参构造函数,完成子类从父类继承下来的成员的初始化工作, 父类中的默认值也是nullptr

    , ui(new Ui::Widget)         //对自己类中的成员实例化空间, ui::widget
{
    ui->setupUi(this);           //给拖拽出的组件实例化空间,this说明它们依附的父组件是widget::widget


}

Widget::~Widget()             //析构函数,里边的组件ui里是没有delete p的,但是空间仍然会被释放,是因为qt中有一套自己的简易好用的内回收机制(对象模型机制)
                             //析构此组件时,他是将依附于自己的子组件先进行析构,然后再析构自己
{
    delete ui;              //成员指针的内存进行释放
}

Guess you like

Origin blog.csdn.net/qq_46766479/article/details/132592070