QT純程式碼實現簡單登入
新建Qt Widgets Application,專案名稱為login1,在類資訊頁面保持類名和基類為MainWindow和QMainWindow不變,取消選擇建立介面選項
這裡依然建立了Qt Widgets應用,但是沒有使用介面檔案,這樣就需要使用程式碼來實現介面。
建立登入對話方塊類。往專案中新增新檔案,模板選擇C++分類中的C++ Class
在類定義頁面,將類名設定為LoginDialog,基類選擇Custom定製,然後手動設定為QDialog。
設定完成後,先開啟logindialog.h檔案,將其內容修改如一下程式碼所示:
#ifndef LOGINDIALOG_H #define LOGINDIALOG_H #include <QDialog> #include <QLabel> #include <QLineEdit> class LoginDialog : public QDialog { Q_OBJECT public: LoginDialog(QWidget *parent = 0); ~LoginDialog(); private: QLabel *usrLabel; QLabel *pwdLabel; QLineEdit *usrLineEdit; QLineEdit *pwdLineEdit; QPushButton *LoginBtn; QPushButton *exitBtn; private slots: void login(); void close(); signals: void signal_username(QString); }; #endif // LOGINDIALOG_H
這裡先添加了QDialog類的標頭檔案,然後前置聲明瞭QLabel、QLineEdit和QPushButton類,這是因為在下面只是定義了這些類物件的指標,並不需要該類完整的定義,所以可以將它們的包含語句放到原始檔中進行。在LoginDialog類宣告的開始需要新增Q_OBJECT巨集才能使用訊號和槽等元物件系統功能。在private部分定義了一些介面上需要的部件物件的指標。下面到logindialog.cpp檔案中對這些部件物件進行初始化,其內容如以下程式碼所示:
這裡定義了建構函式和解構函式,在建構函式中對介面部件進行了初始化,設定了它們的位置及要顯示的文字,這些程式碼實現的效果與前面在設計模式設定部件實現的效果是一樣的。#include "logindialog.h" #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QMessageBox> LoginDialog::LoginDialog(QWidget *parent):QDialog(parent) { usrLabel = new QLabel(this); usrLabel->move(70,80); usrLabel->setText("使用者名稱"); usrLineEdit = new QLineEdit(this); usrLineEdit->move(140,80); usrLineEdit->setPlaceholderText("請輸入使用者名稱"); pwdLabel = new QLabel(this); pwdLabel->move(70,130); pwdLabel->setText("密碼"); pwdLineEdit = new QLineEdit(this); pwdLineEdit->move(140,130); pwdLineEdit->setPlaceholderText("請輸入密碼"); LoginBtn = new QPushButton(this); LoginBtn->move(70,200); LoginBtn->setText("登入"); exitBtn = new QPushButton(this); exitBtn->move(220,200); exitBtn->setText("退出"); connect(LoginBtn,SIGNAL(clicked(bool)),this,SLOT(login())); connect(exitBtn,SIGNAL(clicked(bool)),this,SLOT(close())); } LoginDialog::~LoginDialog(){ } void LoginDialog::login(){ if(usrLineEdit->text().trimmed()=="qust"&&pwdLineEdit->text().trimmed()=="123"){ accept(); }else{ QMessageBox::warning(this,"警告","密碼或者使用者名稱錯誤!",QMessageBox::Yes); usrLineEdit->clear(); pwdLineEdit->clear(); usrLineEdit->setFocus(); } } void LoginDialog::close(){ this->close(); }
下面開啟main.cpp檔案,在其中使用登入對話方塊,更改程式碼如以下程式碼所示:
#include "mainwindow.h" #include <QApplication> #include "logindialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; LoginDialog dlg; if(dlg.exec()==QDialog::Accepted){ w.show(); } return a.exec(); }
下面來實現兩個按鈕的功能,在Qt中,按鈕按下功能是通過訊號和槽來實現的,在前面的內容中我們已經看到三種方式來關聯訊號和槽了,下面來看下怎麼使用程式碼自定義槽,然後手動進行關聯。
首先在logindialog.h檔案的類宣告的最後新增如下程式碼:
private slots:
void login();
這樣便聲明瞭一個槽,其實槽就是一個函式,一般使用slots關鍵字,但在Qt 5新關聯語法下也可以不使用該關鍵字,那麼就可以像宣告一般函式一樣來宣告槽,具體的內容我們將在後面章節中講解,這裡大家有個印象即可,一般建議使用slots關鍵字。
下面開啟logindialog.cpp檔案,在建構函式的最後新增如以下所示的兩行程式碼:
connect(loginBtn,SIGNAL(clicked(bool)),this,SLOT(login()));
connect(editBtn,SIGNAL(clicked(bool)),this,SLOT(close()));
這裡的connect()函式就是用來關聯訊號和槽的,簡單來說,第一個引數就是發射訊號的部件,比如這裡的loginBtn按鈕;第二個引數是發射的訊號,比如這裡是QPushButton類的單擊clicked()訊號;第三個引數是接受訊號的部件,比如這裡是this即本部件也就是LoginDialog;第四個引數是要執行的槽,比如這裡是LoginDialog類的login()。使用connect()函式就相當於以前在設計模式進行的關聯設定。
下面在logindialog.cpp檔案最後新增槽的定義。
void LoginDialog::login(){
if(usrLineEdit->text().trimmed()=="qust"&&pwdLineEdit->text().trimmed()=="123"){
accept();
}else{
QMessageBox::warning(this,"警告","密碼或者使用者名稱錯誤!",QMessageBox::Yes);
usrLineEdit->clear();
pwdLineEdit->clear();
usrLineEdit->setFocus();
}
}
void LoginDialog::close(){
this->close();
}