Qt5開發學習總結(四)——資源文件的使用與主窗口QMainWindow實現登錄框

主窗口框架

主窗口爲建立應用程序用戶界面提供了一個框架,QT提供QMainWindow和其他相關類共同完成主窗口管理。

使用QT資源文件

1.創建主窗口菜單

( 1) 新建 Qt Widgets 應用, 項目名稱爲 myMainWindow, 基類選擇 QMainWindow, 類名爲MainWindow。
( 2) 創建完項目後, 雙擊 mainwindow.ui 文件進入設計模式。可以看到界面左上角的“這裏輸入”,可以在這裏添加菜單. 雙擊“ 在這裏輸入”,將其更改爲“ 文件(&F)”,然後按下回車鍵,效果如圖所示。這裏的&F 表明將菜單的快捷鍵設置爲了 Alt + F, 可以看到,實際的顯示效果中&符號是隱藏的。
這裏寫圖片描述
( 3) 同樣的方法, 在文件菜單中添加“ 新建(&N)” 菜單項( 如果無法輸入中文, 可以從別處複製粘貼), 效果如圖所示。 菜單後面的那個加號圖標是用來創建下一級菜單的。
這裏寫圖片描述

2.添加菜單圖標

( 1) Qt 中的一個菜單項被看做是一個 Action, 在設計器下面的 Action 編輯器中可以看到剛纔添加的“ 新建” 動作, 如圖 所示。
這裏寫圖片描述
( 2) 雙擊 action_N 條目, 會彈出編輯動作對話框, 這裏可以進行各項設置, 比如可以設置動作的快捷鍵, 點擊一下快捷鍵後面的行編輯器, 然後按下鍵盤上的 Ctrl + N, 這樣就可以將該菜單的快捷鍵設置爲 Ctrl + N。
( 3)在編輯動作對話框中的圖標後面的 黑色箭頭下拉框可以選擇使用資源還是使用文件來設置圖標, 如果使用文件的話, 那麼就可以直接在彈出的文件對話框中選擇本地磁上的一個圖標文件。 如果直接單擊這個按鈕默認是使用資源。現在先按下編輯動作對話框的“ OK” 按鈕關閉它。

3.添加資源文件

Qt 中可以使用資源文件將各種類型的文件添加到最終生成的可執行文件中, 這樣就可以避免使用外部文件可能出現的一些問題。 而且,在編譯時 Qt 還會將資源文件進行壓縮,可以使可執行文件的體積儘可能縮小。
( 1) 向項目中添加新文件, 模板選擇 Qt 分類中的 Qt Resource File, 如圖所示, 然後將名稱設置爲“ myResources”。
這裏寫圖片描述
( 2) 創建完文件後會自動打開該資源文件, 這裏需要先在下面添加前綴, 點擊添加按鈕,然後選擇前綴, 默認的前綴是“ /new/prefix1”, 這個可以隨意修改( 不要出現中文字符)。這裏因爲要添加圖片, 所以修改爲/myImages。 然後再按下添加按鈕來添加文件, 這裏最好將所有要用到的圖片放到項目目錄中。 比如這裏在項目目錄中新建了一個 images 文件夾,然後將需要的圖標文件複製進去。 添加完文件後, 如圖所示。
這裏寫圖片描述
( 3) 當添加完資源後, 一定要按下 Ctrl + S 來保存資源文件, 不然在後面可能無法顯示已經添加的資源。

4.使用資源文件

( 1) 重新到設計模式打開新建菜單的編輯動作對話框, 然後添加圖標。 在打開的選擇資源對話框中, 第一次可能無法顯示已經存在的資源, 可以按下左上角的綠箭頭 來更新顯示。效果如圖所示。
這裏寫圖片描述
( 2) 點擊這裏需要的新建圖標 xxx.png, 按下“ OK” 按鈕即可。 現在按下 Ctrl + R 鍵運行可看到圖標已經改變。

創建登陸對話框

關於創建登錄對話框前面用Dialog試過一次,這裏再學習用常用的MainWindow實現一遍
( 1) 新建 Qt Widgets 應用, 項目名稱爲“login”, 類名和基類保持 MainWindow 和QMainWindow 不變。
( 2)完成項目創建後,向項目中添加新的 Qt 設計師界面類,模板選擇 Dialog without Buttons,類名更改爲“ LoginDialog”。 完成後向界面上添加兩個標籤 Label、 兩個行編輯器 Line Edit和兩個按鈕 Push Button.
( 3)在屬性編輯器中將用戶名後面的行編輯器的 object Name 屬性更改爲“ userEdit”,密碼後面的行編輯器的 object Name 屬性更改爲“ pssEdit”,登錄按鈕的 object Name 屬性更改爲“ loginBtn”,退出按鈕的 object Name 屬性更改爲“ exitBtn”。
( 4) 更換風格,打開main.cpp,添加頭文件包含#include<QStyleFactory>,然後在main()函數中
QApplication a(argc, argv);後添加一句 a.setStyle(QStyleFactory::create(“fusion”));這時候界面就會應用Fusion風格
這裏寫圖片描述
(5) 關聯信號與槽,F4進入信號與槽編輯模式,"退出" 按鈕關聯close(),登錄右鍵轉到槽函數,添加代碼來實現使用用戶名和密碼登錄, 這裏只是簡單的將用戶名和密碼設置爲了固定的字符串apple和123456。 到 logindialog.cpp 文件中將登錄按鈕的單擊信號對應的槽更改如下:

#include "logindialog.h"
#include "ui_logindialog.h"
#include "QMessageBox"
LoginDialog::LoginDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LoginDialog)
{
    ui->setupUi(this);
}
LoginDialog::~LoginDialog()
{
    delete ui;
}
void LoginDialog::on_loginbtn_clicked()
{
    // 判斷用戶名和密碼是否正確,
    // 如果錯誤則彈出警告對話框
    if(ui->useredit->text()==tr("apple")&&ui->passedit->text()==tr("123456"))
    {
    accept();
    }else{
/*   Qt 中的 QMessageBox 類提供了多種常用的對話框類型, 比如這裏的警告對話框, 還有提示對話框、 問題對話框等。 
 這裏使用靜態函數來設置一個警告對話框,這種方式很方便。
其中的參數依次是: this 表明父窗口是登錄對話框, 然後是窗口標題, 然後是顯示的內容,最後一個參數是顯示的按鈕, 
這裏使用了一個 Yes 按鈕。 
*/
        QMessageBox::warning(this,tr("Waring"),
          tr("用戶名或密碼錯誤"),QMessageBox::Yes  );
    /*當登錄失敗後,希望可以清空用戶名和密碼信息, 並將光標定位到用戶名輸入框中。
    這個可以通過在判斷用戶名和密碼錯誤後添加如下代碼來實現
  */
    ui->useredit->clear();
    ui->passedit->clear();
    ui->useredit->setFocus();

    }
}

運行程序, 如果輸入用戶名爲“ yafeilinux”, 密碼爲“ 123456”, 那麼可以登錄, 如果輸入其他的字符, 則會彈出警告對話框, 如圖
這裏寫圖片描述

對於輸入的密碼, 常見的是顯示成小黑點的樣式。 logindialog.ui 選中界面上的密碼行編輯器部件, 在其屬性編輯器中將 echoMode 屬性選擇爲Password。 這時再次運行程序, 可以看到密碼已經改變顯示樣式了。
在行編輯器的屬性欄中還可以設置佔位符, 就是沒有輸入信息前的一些提示語句。 例如將密碼行編輯器的 placeholderText 屬性更改爲“請輸入密碼”, 將用戶名行編輯器的更改爲“請輸入用戶名”
這裏寫圖片描述
對於行編輯器, 還有一個問題, 比如輸入用戶名, 不小心在前面添加了一個空格, 這時也需要保證輸入是正確的, 這個可以使用 QString 類的 trimmed()函數來實現, 它可以去除字符串前後的空白字符。 下面將 logindialog.cpp 文件中登錄按鈕單擊信號關聯的槽函數中的判斷代碼更改爲:

if(ui->usrLineEdit->text().trimmed() == tr("yafeilinux")
&& ui->pwdLineEdit->text() == tr("123456"))

(6) main函數部分,添加重新登錄和退出代碼:
這裏寫圖片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "logindialog.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //按下重新登錄先隱藏當前界面
        close();
      LoginDialog dlg;
        //顯示登陸界面,如果返回值等於這個,也就是點擊了登錄,那麼程序顯示主界面,如果不是,由於此時沒有可以顯示的界面就會完全退出程序
        if(dlg.exec() ==QDialog::Accepted)show();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章