界面切换

界面切换

因为要实现登录和注册界面之间的切换,所以Register类包含了Login类的指针,同时Login也包含了Register类的指针,为避免出现循环引用,Login类的指针使用弱指针。

#include "login.h"      // 登录窗口类的声明
#include "register.h"   // 注册窗口类的声明
#include <QApplication> // Qt 应用程序的入口类
#include <memory>       // std::shared_ptr / std::make_shared 等智能指针

int main(int argc, char *argv[])
{
    // 创建一个 Qt 应用对象(必须的),argc/argv 用于处理命令行参数
    QApplication a(argc, argv);

    // 创建一个智能指针,指向 Login 窗口
    // 使用 std::make_shared 保证内存分配安全高效
    std::shared_ptr<Login> w = std::make_shared<Login>();

    // 初始化登录窗口中的信号槽连接(按钮事件等)
    w->initSignals();

    // 显示登录窗口
    w->show();

    // 启动 Qt 的事件循环,等待用户交互
    // a.exec() 会阻塞在这里,直到应用退出
    return a.exec();
}
#include "login.h"
#include "ui_login.h"   // Qt 设计器生成的 UI 界面头文件
#include "register.h"   // 注册窗口类声明

// 构造函数
Login::Login(QWidget *parent)
    : QDialog(parent)      // 调用 QDialog 构造函数,parent 默认为空
    , ui(new Ui::Login)    // 分配 UI 对象内存
{
    // 初始化 UI 界面(将设计器的控件加载到当前窗口)
    ui->setupUi(this);
}

// 析构函数
Login::~Login()
{
    // 释放 UI 对象
    delete ui;
}

// 初始化信号槽连接或窗口间关系
void Login::initSignals()
{
    // 创建一个 注册窗口(Register)的智能指针
    _register = std::make_shared<Register>();

    // 将当前 Login 窗口的弱引用传递给 注册窗口
    // shared_from_this() 返回当前对象的 shared_ptr
    // 这样 Register 在需要时可以访问 Login(比如注册成功后返回登录界面)
    _register->set_login(shared_from_this());
}

// 登录按钮点击槽函数
void Login::on_pushButton_clicked()
{
    // TODO: 在这里实现登录逻辑,例如验证用户名密码
}

// 注册按钮点击槽函数
void Login::on_pushButton_2_clicked()
{
    // 关闭当前登录窗口
    this->close();

    // 显示注册窗口
    _register->show();
}
#include "register.h"
#include "ui_register.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include "login.h"

// 构造函数
Register::Register(QWidget *parent)
    : QDialog(parent)         // 初始化 QDialog
    , ui(new Ui::Register)    // 分配 UI 对象
{
    ui->setupUi(this); // 加载 Qt Designer 的 UI(虽然本例中大部分 UI 是手动创建的)

    // 设置窗口的固定大小
    this->setMaximumSize(QSize(300, 400));
    this->setMinimumSize(QSize(300, 400));

    // 垂直布局(总容器)
    auto vbox_layout = new QVBoxLayout();

    // ======= 顶部空白间距 =======
    auto verticalSpacer1 = new QSpacerItem(40, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
    vbox_layout->addItem(verticalSpacer1);

    // ======= 邮箱输入区域 =======
    QLabel * name_label = new QLabel(); // 标签:显示“邮箱”
    QSpacerItem * name_item1 = new QSpacerItem(40, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 左间距
    QSpacerItem * name_item2 = new QSpacerItem(40, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 右间距
    name_label->setText(tr("邮箱")); // 设置文字
    QLineEdit * name_edit = new QLineEdit(); // 输入框(邮箱)
    auto name_layout = new QHBoxLayout();    // 水平布局
    name_layout->addItem(name_item1);
    name_layout->addWidget(name_label);
    name_layout->addWidget(name_edit);
    name_layout->addItem(name_item2);
    vbox_layout->addLayout(name_layout); // 把邮箱输入区域放入总布局

    // ======= 邮箱与密码之间的间距 =======
    auto verticalSpacer2 = new QSpacerItem(40, 20, QSizePolicy::Maximum, QSizePolicy::Maximum);
    vbox_layout->addItem(verticalSpacer2);

    // ======= 密码输入区域 =======
    auto pwd_layout = new QHBoxLayout(); // 水平布局
    QLabel * pwd_label = new QLabel();   // 标签:显示“密码”
    QSpacerItem * pwd_item1 = new QSpacerItem(40, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 左间距
    QSpacerItem * pwd_item2 = new QSpacerItem(40, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 右间距
    pwd_label->setText(tr("密码"));
    QLineEdit * pwd_edit = new QLineEdit(); // 输入框(密码)
    pwd_layout->addItem(pwd_item1);
    pwd_layout->addWidget(pwd_label);
    pwd_layout->addWidget(pwd_edit);
    pwd_layout->addItem(pwd_item2);
    vbox_layout->addLayout(pwd_layout); // 加入总布局

    // ======= 密码和按钮之间的间距 =======
    auto verticalSpacer3 = new QSpacerItem(40, 20, QSizePolicy::Fixed, QSizePolicy::Expanding);
    vbox_layout->addItem(verticalSpacer3);

    // ======= 注册按钮区域 =======
    QSpacerItem * reg_btn_item1 = new QSpacerItem(140, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 左间距
    QSpacerItem * reg_btn_item2 = new QSpacerItem(140, 20, QSizePolicy::Fixed, QSizePolicy::Minimum); // 右间距

    auto _reg_btn = new QPushButton(); // 注册按钮
    _reg_btn->setText("注册");
    auto regbtn_layout = new QHBoxLayout(); // 水平布局
    regbtn_layout->addItem(reg_btn_item1);
    regbtn_layout->addWidget(_reg_btn, 5); // 按钮权重为 5
    regbtn_layout->addItem(reg_btn_item2);
    vbox_layout->addLayout(regbtn_layout);

    // ======= 按钮与底部之间的间距 =======
    auto verticalSpacer4 = new QSpacerItem(40, 160, QSizePolicy::Fixed, QSizePolicy::Expanding);
    vbox_layout->addItem(verticalSpacer4);

    // 设置总布局到当前窗口
    this->setLayout(vbox_layout);

    // 连接注册按钮点击信号到槽函数 slot_regigter
    connect(_reg_btn, &QPushButton::clicked, this, &Register::slot_regigter);
}

// 析构函数
Register::~Register()
{
    delete ui; // 释放 UI 对象
}

// 由 Login 调用,把登录窗口的弱引用保存下来
void Register::set_login(const std::weak_ptr<Login> &login)
{
    _login = login;
}

// 注册按钮点击时的槽函数
void Register::slot_regigter()
{
    // 关闭注册窗口
    this->close();

    // 尝试把弱引用锁成强引用
    auto shared_login = _login.lock();
    if (shared_login) // 如果登录窗口还存在
    {
        // 显示登录窗口
        shared_login->show();
    }
}
posted @ 2025-08-15 20:30  xiaoluosibky  阅读(14)  评论(0)    收藏  举报