一、創建對話框基本步驟
- 創建并初始化子窗口部件
- 把子窗口部件放到布局中
- 設置tab鍵順序
- 建立信號-槽之間的連接
- 實現對話框中的自定義槽
首先前面三步在這里是通過ui文件里面直接進行的,剩下兩步則是通過代碼來實現
二、項目創建詳細步驟
創建新項目
為項目命名
?
?為類起名并選擇基類為QDialog
【如果這里沒有選擇QDialog而是選擇默認的QMainWindow的話會導致后面運行的時候setupUi函數報錯】
三、ui可視化對話框界面設計實現詳細步驟
雙擊 gotocelldialog.ui文件打開設計界面,左側為工具欄,右側則是進行設計的界面,只需要將左側的部件拖拽到界面即可實現
先拖拽一個標簽、一個行編輯器、一個水平分隔符和兩個按鈕到界面上
然后修改Lable部件的text為——&Cell Location:
修改第一個按鈕的屬性,將其text改為——OK,其objectName改為——okButton,其enable屬性改為false,其default屬性改為——true
?
修改第二個按鈕的屬性,將其text改為——Cancel,其objectName改為——cancelButton
修改整個窗體的標題與名字——點擊空白部分,然后看屬性部分
到這里部件屬性設置完成
此時界面顯示如下:
接下來就是對部件進行綁定還有對布局進行設計
將lable部件與lineEdit部件綁定,點擊左上角“編輯”——選擇“Edit Buddies”——單擊Lable然后將紅色箭頭與lineEdit連接起來——點擊左上角“編輯”——選擇“Edit Widget”即可
對布局進行設計
同時選中label還有lineEdit——鼠標右鍵——布局——水平布局
同時選中下面三個部件——鼠標右鍵——布局——水平布局
選擇窗體中的空白——鼠標右鍵——布局——調整大小——調整成自己想要的大小——選擇窗體中空白——鼠標右鍵——布局——垂直布局
布局設計完成結果如下:
?
設置Tab鍵順序
點擊左上角“編輯”——選擇“Edit Tab Order”——根據所想順序進行選擇即可
四、對話框實現
①初始實現——使用在ui中設計的窗體、創建QDialog對象、將對象傳遞給窗體、運行
只需要在main.cpp文件內對代碼進行書寫
#include "gotocelldialog.h"#include <QApplication>
#include<QDialog>
#include"ui_gotocelldialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);//定義窗體、創建QDialog對象、將對象傳遞給窗體【對話框能展示,但功能沒有實現】Ui::GoToCellDialog ui;//定義該窗體QDialog *dialog=new QDialog;//創建一個QDialog對象ui.setupUi(dialog);//把QDialog對象傳遞給setupUi函數dialog->show()return a.exec();
}
此時會顯示前面所設計的界面,但是按鈕功能與行編輯器的限制都沒有實現
②進階實現——定義新類繼承Ui初始化的GoToCellDialog類還有QDialog并利用信號-槽實現功能
?gotocelldialog.h 代碼【新類定義】
#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H#include<QDialog>
#include"ui_gotocelldialog.h"//創建一個新類,讓此類同時從QDialog和Ui::GoToCellDialog中繼承出來,并且實現前面所涉及的窗體中所需要實現的功能
class GoToCellDialog : public QDialog,public Ui::GoToCellDialog
{Q_OBJECTpublic:GoToCellDialog(QWidget *parent = nullptr);//構造函數~GoToCellDialog();//析構函數
private slots:void on_lineEdit_textChange();//實現對OK按鈕的啟用/禁用
private:Ui::GoToCellDialog *ui;
};
#endif // GOTOCELLDIALOG_H
gotocelldialog.cpp 代碼【信號與槽綁定與實現】
#include<QtGui>
#include "gotocelldialog.h"//構造函數的實現
GoToCellDialog::GoToCellDialog(QWidget *parent): QDialog(parent)
{setupUi(this);//初始化窗體//設置一個檢驗器來限制輸入的范圍 QRegExpValidator內置檢驗器后面帶一個正則表達式QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");//正則表達式//允許一個大寫/小寫字母,后面跟著一個范圍為1-9的數字,后面再跟一個0個、1個或者2個0-9的數字lineEdit->setValidator(new QRegExpValidator(regExp,this));//第一個connect已經通過setupUi自動建立了//因為setupUi()函數會自動將那些符合on_objectName_signalName()命名慣例的任意槽與其相應的objectName的signalName()信號連接到一起//connect(lineEdit,SIGNAL(textChange(const QString &)),this,SLOT(on_lineEdit_textChange()));//accept()槽是QDialog的,其可以將對話框返回的結果變量設置為QDialog::Accept(其值等于1)connect(okButton,SIGNAL(clicked()),this,SLOT(accept()));//當點擊OK按鈕時,觸發accept()槽//reject()槽是QDialog的,其可以將對話框的值設置為QDialog::Reject(其值等于0)connect(cancelButton,SIGNAL(clicked()),this,SLOT(reject()));//當點擊Cancel按鈕時,觸發reject()槽//可以利用對話框的結果變量判斷用戶是否單擊了OK按鈕
}//實現對OK按鈕的啟用/禁用
void GoToCellDialog::on_lineEdit_textChange(){//根據行編輯器中是否包含了有效的單元格位置坐標,從而實現對OK按鈕的啟用或者禁用//hasAcceptableInput()用于判斷行編輯器中內容的有效性 有效則禁用,無效則啟用okButton->setEnabled(lineEdit->hasAcceptableInput());
}GoToCellDialog::~GoToCellDialog()
{delete ui;
}
main.cpp 代碼
#include "gotocelldialog.h"#include <QApplication>
#include<QDialog>
#include"ui_gotocelldialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);//進階想法——定義新類繼承Ui初始化的類還有QDialog并利用信號-槽實現功能GoToCellDialog *dialog=new GoToCellDialog;dialog->show();return a.exec();
}
運行結果:
當行編輯器中的文字不符合輸入規定時不允許輸入且OK按鈕禁用;當行編輯器中內容符合輸入規定時OK按鈕啟用
?