新建一個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的生命周期要長。這樣可能會導致內存不能正確釋放,造成內存泄漏。