实现登录界面点击注册按钮后,主窗口显示注册页面

效果展示:
在这里插入图片描述

  1. 主窗口 (MainWindow) 启动时显示 登录对话框 (LoginDialog).

  2. 登录对话框 上的注册按钮 (reg_btn) 被点击后,触发 switchRegister 信号。

  3. 该信号连接到 主窗口 (MainWindow) 的 SlotSwitchReg 槽函数,执行切换操作。

  4. 在 SlotSwitchReg 槽函数中,登录对话框被隐藏,注册对话框 (RegisterDialog) 被设置为新的核心部件并显示。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    _login_dlg = new LoginDialog();
    setCentralWidget(_login_dlg);//设置到mainwindow的核心组件里
    _login_dlg->show();//上面的第一步
    //创建和注册消息界面的连接
    // 该信号连接到 主窗口 (MainWindow) 的 SlotSwitchReg 槽函数,执行切换操作。
    connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::SlotSwitchReg); _reg_dlg = new RegisterDialog();
    }
    void MainWindow::SlotSwitchReg()
    {
    setCentralWidget(_reg_dlg);
    _login_dlg->hide();
    _reg_dlg->show();
    }
    //下面是LoginDialog.cpp
    LoginDialog::LoginDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::LoginDialog)
    {
    ui->setupUi(this);
    connect(ui->reg_btn,&QPushButton::clicked,this,&LoginDialog::switchRegister);//注册按钮 (reg_btn) 被点击后,触发 switchRegister 信号。
    }

    在这里插入图片描述

布置界面颜色


QDialog#LoginDialog,#RegisterDialog,#ResetDialog{
background-color:rgb(255,255,255)
}

#user_label,#pass_label{
color:black;
}

在这里插入图片描述

内存泄漏修复

关掉上面的界面时,程序出现了异常崩溃。

21:23:19: Starting F:\04Code\QT\ChatNova_linff911\build\Desktop_Qt_6_9_1_MinGW_64_bit-Debug\bin\ChatNova_linff911.exe…
open success
21:23:35: 进程崩溃了。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
_login_dlg = new LoginDialog(this);
setCentralWidget(_login_dlg);//设置到mainwindow的核心组件里
_login_dlg->show();
//创建和注册消息界面的连接
connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::SlotSwitchReg);
_reg_dlg = new RegisterDialog(this);
}

MainWindow::~MainWindow()
{
delete ui;
/*注释掉这里就不会出现异常了
if(_login_dlg) {
delete _login_dlg;
_login_dlg = nullptr;
}
if(_reg_dlg) {
delete _reg_dlg;
_reg_dlg = nullptr;
}
*/
}

void MainWindow::SlotSwitchReg()
{
setCentralWidget(_reg_dlg);
_login_dlg->hide();
_reg_dlg->show();
}

但是会导致出现多个窗口,dialog并没有嵌入mainwindow中

解决:首先把登录dialog和注册dialog设置大小和mainwindow一致.然后设置_login_dlg->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);通过设置这些窗口标志,实际上把dialog窗口的外观修改为无框且不独立的。这使得dialog的表现更像是嵌入在MainWindow内部,而不是作为一个独立的窗口弹出,从而避免了出现多个独立窗口的情况。

在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
_login_dlg = new LoginDialog(this);
setCentralWidget(_login_dlg);//设置到mainwindow的核心组件里
_login_dlg->show();
//创建和注册消息界面的连接
connect(_login_dlg, &LoginDialog::switchRegister, this, &MainWindow::SlotSwitchReg);
_reg_dlg = new RegisterDialog(this);
//这段代码的作用是设置dialog窗口的窗口标志。具体来说:

//Qt::CustomizeWindowHint 去除了窗口的默认边框和标题栏,让你可以自定义窗口的外观。

//Qt::FramelessWindowHint 使得窗口变成无框窗口,移除了标准的窗口边框和标题栏,这通常用于自定义样式的对话框或窗口。
_login_dlg->setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);//把dialog窗口的外观修改为无框且不独立的
_reg_dlg->setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);//把dialog窗口的外观修改为无框且不独立的
}

MainWindow::~MainWindow()
{
delete ui;
/*
if(_login_dlg) {
delete _login_dlg;
_login_dlg = nullptr;
}
if(_reg_dlg) {
delete _reg_dlg;
_reg_dlg = nullptr;
}
*/
}

void MainWindow::SlotSwitchReg()
{
setCentralWidget(_reg_dlg);
_login_dlg->hide();
_reg_dlg->show();
}

邮箱输入不合法会报红提示

void RegisterDialog::on_get_code_clicked()
{
auto email = ui->email_edit->text();
QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+)");
bool match = regex.match(email).hasMatch();
if(match) {
//发送http验证码
}
else{
showTip(tr("邮箱地址不正确"));
}
}

void RegisterDialog::showTip(QString str)
{
ui->error_tip->setText(str);
ui->error_tip->setProperty("state","err");
repolish(ui->error_tip);
}

在这里插入图片描述