ChatNova项目:登录界面设置
通过设置这些窗口标志,实际上把dialog窗口的外观修改为无框且不独立的。这使得dialog的表现更像是嵌入在MainWindow内部,而不是作为一个独立的窗口弹出,从而避免了出现多个独立窗口的情况。在 SlotSwitchReg 槽函数中,登录对话框被隐藏,注册对话框 (RegisterDialog) 被设置为新的核心部件并显示。登录对话框 上的注册按钮 (reg_btn) 被点击后,触发 sw
实现登录界面点击注册按钮后,主窗口显示注册页面
之前做分布式即时通讯的项目,秋招太忙搁置了,后面秋招结束整理好发出来和大家一起学习~
效果展示:
-
主窗口 (MainWindow) 启动时显示 登录对话框 (LoginDialog).
-
登录对话框 上的注册按钮 (reg_btn) 被点击后,触发 switchRegister 信号。
-
该信号连接到 主窗口 (MainWindow) 的 SlotSwitchReg 槽函数,执行切换操作。
-
在 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);
}
更多推荐
所有评论(0)