Qt學習一、簡單的登陸驗證


新建一個Qt Widgets Application項目,項目名為login,這便生成一個桌面圖形界面項目。如下圖所示,

然后新加一個Qt設計師界面類,模版選擇Dialog without Buttons,命名為LoginDialog。如下圖:

完成后向界面拖入兩個Label、兩個Line Edit和兩個Push Button控件,設計界面如下圖所示:

然后先選中用戶名后面的Line Edit控件,在屬性編輯器中將其objectName屬性更改為userLineEdit,密碼后面的更改為pwdLineEdit,登陸按鈕為loginBtn,退出按鈕為exitBtn。如下圖:

再將密碼后面的Line Edit的echoModel屬性設置為Password,使輸入框不顯示明文,而現實小黑點。再將placeholderText屬性修改為”請輸入密碼“,同樣方式將用戶名后面的Line Edit的placeholderText屬性修改為"請輸入用戶名"。palceholderText屬性是水印字(占位符),可以設置一些提示信息,如下:

然后選中登陸按鈕,右鍵選擇轉到槽,選擇clicked(),如下:

修改槽函數如下:

void LoginDialog::on_loginBtn_clicked()
{
    //如果用戶名密碼正確,則調用accept()槽函數。QDialog中的accept函數會關閉自身並發送QDialog::accepted標識
    if (ui->userlineEdit->text() == "username" && ui->pwdlineEdit->text() == "123456")
        accept();
    else
    {
        QMessageBox::warning(this,"警告","用戶名或密碼錯誤!",QMessageBox::Yes);
        //清除內容並定位光標
        ui->userlineEdit->clear();
        ui->pwdlineEdit->clear();
        ui->userlineEdit->setFocus();
    }
}

雙擊logindialog.ui文件進入設計模式,點擊按鈕,然后左鍵點擊界面上的退出按鈕進行拖拽,連接到logindialog界面,選擇clicked()信號,槽選擇close(),這樣按退出按鈕便會退出程序

最后到main.cpp中,更改main函數如下:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    LoginDialog dlg;
    if (dlg.exec() == QDialog::Accepted)
    {
        w.show();
        return a.exec();
    }
    else return 0;
}

運行程序。

 

純代碼實現:

重新建一個項目,依然命名為login。然后新加一個c++類,命名為loginDialog,父類選擇QDialog。

修改logindialog.h文件如下:

第四到八行是導入所需頭文件。然后聲明六個私有變量,也就是窗口所需顯示部件,兩個槽函數,用來響應按鈕點擊事件。其中Q_OBJECT必須添加,這樣才可以使用Qt中的信號和槽以及元對象系統功能。然后進入logindialog.cpp文件中,對部件進行初始化

loginDialog::loginDialog()
{
    //創建窗口顯示部件
    user = new QLabel(this);
    user->setText("用戶名");
    user->move(70,80);

    pwd = new QLabel(this);
    pwd->setText("密碼");
    pwd->move(70,130);

    userLineEdit = new QLineEdit(this);
    userLineEdit->setPlaceholderText("請輸入用戶名");
    userLineEdit->move(140,80);

    pwdLineEdit = new QLineEdit(this);
    pwdLineEdit->setPlaceholderText("請輸入密碼");
    pwdLineEdit->setEchoMode(QLineEdit::Password);
    pwdLineEdit->move(140,130);

    loginBtn = new QPushButton(this);
    loginBtn->setText("登陸");
    loginBtn->move(50,200);

    exitBtn = new QPushButton(this);
    exitBtn->setText("退出");
    exitBtn->move(210,200);

    //連接信號和槽
    connect(loginBtn,SIGNAL(clicked()),this,SLOT(on_login_click()));
    connect(exitBtn,SIGNAL(clicked()),this,SLOT(on_exit_click()));
}

然后實現登陸按鈕和退出按鈕相應的槽函數

void loginDialog::on_login_click()
{
    //trimmed()函數:去除字符串兩端空格
    if (userLineEdit->text().trimmed() == "username" && pwdLineEdit->text() == "123456")
    {
        accept();
    }
    else {
        QMessageBox::warning(this,"警告!","用戶名或者密碼錯誤",QMessageBox::Yes);
        userLineEdit->clear();
        pwdLineEdit->clear();
        userLineEdit->setFocus();
    }
}

void loginDialog::on_exit_click()
{
    close();
}

最后進入main.cpp文件中,將main函數修改為:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    loginDialog ldg;
    if (ldg.exec() == QDialog::Accepted)
    {
        w.show();

        return a.exec();
    }
    else return 0;
}

在main函數中創建對象最好使用loginDialog ldg方式,因為這種方式是創建在棧上,內存由系統自動管理。這樣當程序關閉時,就會自動釋放掉ldg所占內存。如果修改為loginDialog* ldg=new loginDialog,則創建在了堆上,而app是在棧上的,這意味着ldg會在app之后析構,也就是說ldg的生命周期比app的生命周期要長。這樣可能會導致內存不能正確釋放,造成內存泄漏。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM