QT4.8.6 登录界面之记住密码、自动登录、界面无边框全透明、程序启动画面

之前草草的做了一个登录界面,现在根据需求做一定的更改、完善,包括记住密码、登录等,效果如下图:

一、程序启动画面  

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);
    }
}

欢迎大家指教,希望大家喜欢

路漫漫其修远兮,同志仍须努力

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xumingyifrend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值