界面切换
界面切换
因为要实现登录和注册界面之间的切换,所以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();
}
}

浙公网安备 33010602011771号