Qt小项目(1):密码系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Artanis23/article/details/52204371
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/Artanis23/article/details/52204371

在很多项目中,我们通常不会想让其他人使用我们项目编译出来的应用程序,只让一个人使用。

那么这个时候,我们就可以通过编写密码界面,让别人输入密码才能进入应用。这样子就能有效防止别人偷偷进入应用。

以QQ的登录界面作为例子:

所以我们的界面需要一个QLineEdit来输入密码,一个QPushButton来开始验证密码。

那么又该如何编写密码界面呢?

1、创建一个叫做password的类。

2、定义控件QLineEdit,QPushButton

	QPushButton *start;
	QLineEdit *mytext;

3.把控件分配空间后放置到窗口并设置窗口标题

    QVBoxLayout *layout=new QVBoxLayout;
    start = new QPushButton(tr("Check"));
    mytext = new QLineEdit;

    layout->addWidget(mytext);
    layout->addWidget(start);
    this->setLayout(layout);

	setWindowTitle(tr("登陆代码管理系统"));

4.由于输入密码时mytextt显示的是若干个’*’,而默认的QLineEdit显示的就是你所输入的。
因此我们应该修改mytext的默认设置,也就是重写它的键盘事件。
但键盘事件的前提是设置焦点。

mytext->setFocus();

5.点击start后触发check函数检查用户输入。

    connect(start,&QPushButton::clicked,
            this,&password::check);

6.安装过滤器

mytext->installEventFilter(this);

7.开始重写过滤器

    if(obj==mytext && event->type()==QEvent::KeyPress){//如果在mytext发生键盘事件
        QKeyEvent *keyEvent=static_cast<QKeyEvent *>(event);
        if(keyEvent->key()==Qt::Key_Backspace){//Windows是Delete键,如果输入的是删除键
            if(intext.size()>=1){//如果用户输入的长度大于等于1
                intext=intext.left(intext.size()-1);//那么长度减一
                display=display.left(display.size()-1);//星号-1
            }
        }
        else if(keyEvent->key()==Qt::Key_Return){//如果按了回车键,开始检查
            check();
        }
        else{
            if(keyEvent->text()!=""){//如果按的不是热键
                intext+=keyEvent->text();//输入的添加刚刚按下的东西
                display+='*';//添加一个星号
            }
        }
        mytext->setText(display);//显示星号
        return true;//处理完毕,不再继续传播
    }
    return false;//继续传播

8.写check函数

    if(intext==tr("123")){//如果密码正确
        QMessageBox::information(this,tr("Attention"),tr("Password Right."));//显示密码正确的消息
    }
    else{
        QMessageBox::information(this,tr("Attention"),tr("Password wrong."));//否则显示错误
    }
    mytext->setText("");
    display="";
    intext="";
    //全部清除

这个简短的小项目就完成了。
效果如下:

下面是完整代码:

password.h

#ifndef PASSWORD_H
#define PASSWORD_H

#include <QWidget>
#include <QtWidgets>

class password : public QWidget
{
    Q_OBJECT

public:
    password(QWidget *parent = 0);
    ~password();
protected:
    bool eventFilter(QObject *, QEvent *);
private:
    QPushButton *start;
    QLineEdit *mytext;

    void check();
};

#endif // PASSWORD_H

password.cpp

#include "password.h"

QString intext="";
QString display="";

password::password(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *layout=new QVBoxLayout;
    start = new QPushButton(tr("Check"));
    mytext = new QLineEdit;

    layout->addWidget(mytext);
    layout->addWidget(start);
    this->setLayout(layout);

    mytext->setFocus();
    mytext->installEventFilter(this);

    connect(start,&QPushButton::clicked,
            this,&password::check);

    setWindowTitle(tr("登陆代码管理系统"));
}

password::~password()
{

}

bool password::eventFilter(QObject *obj, QEvent *event){
    if(obj==mytext && event->type()==QEvent::KeyPress){
        QKeyEvent *keyEvent=static_cast<QKeyEvent *>(event);
        if(keyEvent->key()==Qt::Key_Backspace){
            if(intext.size()>=1){
                intext=intext.left(intext.size()-1);
                display=display.left(display.size()-1);
            }
        }
        else if(keyEvent->key()==Qt::Key_Return){
            check();
        }
        else{
            if(keyEvent->text()!=""){
                intext+=keyEvent->text();
                display+='*';
            }
        }
        mytext->setText(display);
        return true;
    }
    return false;
}


void password::check(){
    if(intext==tr("123")){
        QMessageBox::information(this,tr("Attention"),tr("Password Right."));
    }
    else{
        QMessageBox::information(this,tr("Attention"),tr("Password wrong."));
    }
    mytext->setText("");
    display="";
    intext="";
}

展开阅读全文

没有更多推荐了,返回首页