【Qt学习笔记】7.对话框Dialog
對話框:用于提示用戶輸入
對話框分為兩種:
1、模式對話框Modal
背景界面卡住,用戶必須在完成對話框輸入并關閉對話框之后,才能回到背景界面
2、非模式對話框Non-Modal
背景界面可以活動,這篇博客將分別介紹
一、模式對話框Modal
新建對話框
小練習:點擊登陸按鈕,彈出對話框提示用戶要輸入信息才能登陸,用戶點擊確認或取消,回到主界面。
要求:
1、新建對話框,布局
2、點確定時,accept()對話框返回; 點取消時,reject()對話框返回
3、運行對話框exec(),注意exec的返回值
4、取得用戶輸入
步驟:
1、需要定義一個新的GUI類,繼承自QDialog
添加完,在Qt Disigner中會發現多了一個窗體,對它進行布局。
2、在主窗體中 包含 剛剛添加的頭文件,在事件中創建對象,并執行exec()方法。
3、在LoginDlg窗體中添加事件,及響應的處理,代碼如下:
Test7_1a_12_7::Test7_1a_12_7(QWidget?*parent):?QMainWindow(parent) {ui.setupUi(this);assert(connect(ui.btnLogin,SIGNAL(clicked()),this,SLOT(OnBtnLogin()))); }int?Test7_1a_12_7::OnBtnLogin() {//創建對話框LoginDlg?dlg(this); //這個地方,如果傳參不指定父類,則該窗口時獨立的,若?指定,則需要處理完該窗口,才可以操作父類int?ret?=?dlg.exec(); //對話框顯示,程序阻塞//判斷子窗口的運行結果if?(ret?==?QDialog::Accepted){QMessageBox::information(this,?"success",?"success");}else?if(ret?==?-1)?{QMessageBox::information(this,?"wrong",?"wrong");}return?0; }///LoginDlg::LoginDlg(QWidget?*parent):?QDialog(parent) {ui.setupUi(this);assert(connect(ui.btnEnter,SIGNAL(clicked()),this,SLOT(OnBtnEnter())));assert(connect(ui.btnCancel,SIGNAL(clicked()),this,SLOT(OnBtnCancel())));}LoginDlg::~LoginDlg() { }int?LoginDlg::OnBtnEnter() {if?(ui.lineEditName->text()?==?"admin"?&&?ui.lineEditPswd->text()?==?"123456"){accept(); //表示成功}reject(); //表示密碼錯誤 }int?LoginDlg::OnBtnCancel() {return?-1; //取消 }二、文件對話框
Qt中有一個QFileDialog類
//打開文件: static?QString?QFileDialog::getOpenFileName//保存文件: static?QString?QFileDialog::getSaveFileName這兩個static函數,返回值均為被選擇的文件名
舉例:
打開一個文本文檔,并顯示
Test7_2b_12_7::Test7_2b_12_7(QWidget?*parent):?QMainWindow(parent) {ui.setupUi(this);assert(connect(ui.btnOpen,SIGNAL(clicked()),this,SLOT(OnBtnOpen())));assert(connect(ui.btnSave,SIGNAL(clicked()),this,SLOT(OnBtnSave()))); }QString?Test7_2b_12_7::OnBtnOpen() {QString?FilePath;while?(FilePath.length()?<=?0){FilePath?=?QFileDialog::getOpenFileName(this,?AfGbk::ToUnicode("打開"));}return?FilePath; }QString?Test7_2b_12_7::OnBtnSave() {QString?FilePath?=?QFileDialog::getOpenFileName(this,?AfGbk::ToUnicode("保存"));return?FilePath; }再做一個小練習,實現一個簡單的文本編輯器,允許打開文檔并進行修改和保存
打開:
保存:
QString?Test7_2b_12_7::OnBtnSave() {QString?FilePath;while?(FilePath.length()?<=?0){FilePath?=?QFileDialog::getSaveFileName(this,?AfGbk::ToUnicode("選擇保存路徑"));std::string?gbk_name?=?AfGbk::FromUnicode(FilePath);assert(FilePath?!=?NULL);std::string?gbk_text?=?AfGbk::FromUnicode(ui.plainTextEdit->toPlainText()); //要寫入的內容//打開文件,寫入內容FILE*?fp?=?fopen(gbk_name.c_str(),?"wb");fwrite(gbk_text.c_str(),?1,?gbk_text.length(),?fp);fclose(fp);}return?FilePath; }注意:各個程序的文件對話框界面都是一樣的。
文件對話框的特殊性:它不是普通的對話框,這個對話框本質上是由系統函數提供的
三、優化Qt項目的目錄結構
Qt中有一個QFileDialog類
1、改變程序的輸出位置
程序默認輸出到Debug目錄下
一般是把程序輸出到指定位置,可以在“項目屬性/鏈接器”里面設置
2、代碼放在文件夾里
將*.c *.h *.ui 放在src目錄下,使整個項目的目錄更整潔,容易維護
3、指定進程的當前目錄
我們希望進程的當前目錄就是 *.exe的路徑
四、非模態窗口 (Non-Modal)
Qt中有一個QFileDialog類
模態窗口(Modal):
只有前臺窗口可以接收輸入,后臺被阻塞
非模態窗口(Non-Modal):
前臺、后臺均可接受輸入
非模式窗口的使用:
添加一個Widget類
創建一個Widget對象,作為成員變量
在用戶執行搜索菜單的時候顯示此窗口
當用戶在窗口內有動作時,響應該動作
和對話框的區別:父類不同,這里繼承自窗口Qwidget類,而對話框則繼承自QDialog類
————————————————————————
尾巴:
在打開、關閉時,一定要考慮到這個字符串為空的情況,并進行處理
如果在開發過程中實在懶得寫,至少也一定要用assert()進行斷言,至少不會在很久很久以后坑自己
轉載于:https://blog.51cto.com/zhweizhi/1880501
總結
以上是生活随笔為你收集整理的【Qt学习笔记】7.对话框Dialog的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 讯飞输入法手机APP(更好用的手机输入法
- 下一篇: (转)Predictive learni