之前草草的做了一个登录界面,现在根据需求做一定的更改、完善,包括记住密码、登录等,效果如下图:
一、程序启动画面
QSplashScreen类的描述如下:
程序启动画面能够设置符合软件本身的启动风格,面对大型程序启动缓慢的情况能够更人性化的等待,中途能够处理一些事件动态显示文字等。下面是部分实例代码:
QApplication a(argc, argv);
//设置启动动画代替背景色
QSplashScreen * splash = new QSplashScreen;
QPixmap pixmap(":/icon/IESLAB.png");
QRect deskRect = QApplication::desktop()->availableGeometry(); //默认启动程序在屏幕居中显示
QPixmap m_pixmap = pixmap.scaled(deskRect.width() , deskRect.height() );
splash->setPixmap(m_pixmap);
splash->show();
Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
splash->showMessage(QObject::tr("Setting up the main window...") , topRight , Qt::white);
Qt::Alignment center = Qt::AlignCenter;
QFont font;
font.setPointSize(48);
splash->setFont(font);
splash->showMessage(QObject::tr("welcome to iESlab DDC") , center , Qt::white);
MainWindow w;
w.showMaximized();
w.setFixedSize(w.width(),w.height());
splash->finish(&w);
delete splash;
a.exec();
二、存取配置文件
QSettings类的描述如下:
为了实现程序的自动登录、登录信息保存功能,将采用QSettings实现对配置文件的读取。此处保存了四种信息,存取部分的核心代码如下:
//将当前登录信息存入配置文件
void login::savecfg()
{
QSettings settings("ddc.ini",QSettings::IniFormat);
settings.setValue("username", ui->username->text());
settings.setValue("password", ui->password->text());
settings.setValue("autoLogin", ui->autoLogin->isChecked());
settings.setValue("rememberPassword", ui->rememberPassword->isChecked());
}
//读取上一次保存的登录信息
void login::readcfg()
{
QSettings settings("ddc.ini",QSettings::IniFormat);
QString username = settings.value("username").toString();
QString password = settings.value("password").toString();
autoLogin = settings.value("autoLogin").toBool();
rememberPasswd= settings.value("rememberPassword").toBool();
ui->username->setText(username);
ui->password->setText(password);
ui->autoLogin->setChecked(autoLogin);
ui->rememberPassword->setChecked(rememberPasswd);
}
在构造函数中读取配置文件中的信息,并进行显示、校对,从而实现记住密码和自动登录功能
三、设置登录界面全透明、无边框
由于要适应windows、arm-linux两种系统,因此在有程序启动画面的背景下设置无边框、全透明的登录界面。
设置无边框,构造函数中实现:
setWindowFlags(Qt::FramelessWindowHint); //设置无边框窗体
设置透明背景,构造函数中实现:
setAttribute(Qt::WA_TranslucentBackground, true); //设置透明背景 painter重绘实现
重绘,背景全透明
void login::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// QColor最后一个参数代表alpha通道,一般用作透明度
painter.fillRect(rect(), QColor(50, 50, 50, 0));
}
四、番外
此次遇到一个让我迷惑的问题,搞了一个多小时没有解决,打算暂时搁置,期待有知道的朋友分享解决方法给我哦
问题:之前简易版的登录界面没有自动登录功能,因此没有发现问题。添加了自动登录功能后,发现不能关闭登录界面了,只有点击登录按钮后才能关闭。
背景:槽函数,响应登录按键信号,自动登录时也调用该函数;满足登录条件会执行如下代码:
//重写关闭事件函数,监测关闭dialog时的过程
void login::closeEvent(QCloseEvent *event)
{
if(rememberPasswd)
{
savecfg(); //保存配置
event->accept();
qDebug() << "test";
}
else
{
event->ignore();
qDebug() << "test1";
}
qDebug() << "test2";
}
//监测关闭dialog时的过程
login::~login()
{
qDebug() << "test3";
delete ui;
}
情况1:点击登录按钮,closeEvent()函数执行,析构函数不执行,界面关闭
情况2:自动登录,closeEvent()函数执行,析构函数不执行,界面不关闭
OK,这就是我最以后的地方,为什么执行相同的代码得到的结果却不同!!!???
好吧,一个多小时后~~~~
问题没有解决,打算绕开这个问题先,于是想到都没有执行析构函数,也就是说这个界面在上述两种情况中都还存在
查看close()函数:
发现问题,关闭并删除当前的窗口需要设置Qt::WA_DeleteOnClose(该枚举量代表的意思是:当小部件接受关闭事件时,使qt删除此小部件)。
我猜想:当用户关闭也窗口时,其默认行为是隐藏,没有执行析构函数,所以还会保留在内存中
解决方法:在构造函数中加入
setAttribute(Qt::WA_DeleteOnClose);
完美绕过刚刚的问题。。。至此,相关功能就基本上实现了
期待小伙伴们为我解答刚刚的疑惑哦
补充一个小问题:
登录界面,按Esc键后关闭,直接进入了程序主界面(这怕是要炸,大家都不需要登录,按Esc就进去了)
解决:屏蔽Esc键
//屏蔽Esc按键事件对Dialog的影响
void login::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_Escape:
break;
default:
QDialog::keyPressEvent(event);
}
}
欢迎大家指教,希望大家喜欢
路漫漫其修远兮,同志仍须努力