在編程中,我常常會碰見要根據用戶觸發按鈕,動態生成窗口的狀況。在此有兩種方法能夠動態生成窗口:一:直接在槽函數中調用窗口類。二:將**.ui添加到資源文件,經過QUiLoader加載。編程
現將兩種方法介紹以下。函數
在Qt中建立Qt設計師界面類ui
一:this
1)在函數中實例化窗體gotocelldialog(也能夠不用指針,直接建立變量gotocelldialog)spa
2)使用show或exec方法將其以非模態/模態顯示。設計
3)若是是實例化,在退出函數後應使用delete釋放資源。指針
void MainWindow::GoToCell() { if ( !dialog_) { dialog_ = new GoToCellDialog(this); } if (dialog_->exec()) { .... } //如下兩句能夠不寫,由於dialog_爲類變量,當第一次實例化後,只要程序不退出,dialog_就可一直使用 delete dialog_; dialog_ = 0; }
二:code
1)建立一個UI窗體,添加到工程的資源文件中。orm
2)建立QFile對象加載ui窗體文件。對象
3)建立QUiLodaer對象loader。
4)使用loader加載窗體文件,並強制轉換爲對應類型。
5)使用show或exec方法將其以非模態/模態顯示。
具體代碼以下:
#ifndef CREATINGDYNAMICDIALOG_H #define CREATINGDYNAMICDIALOG_H #include <QDialog> //窗體文件爲Qt自動生成, namespace Ui { class CreatingDynamicDialog; } class CreatingDynamicDialog : public QDialog { Q_OBJECT public: explicit CreatingDynamicDialog(QWidget *parent = 0); ~CreatingDynamicDialog(); private: void SetupConnections(); private slots: void createDynamicDialog(); private: Ui::CreatingDynamicDialog *ui; }; #endif // CREATINGDYNAMICDIALOG_H
#include <QUiLoader> #include <QFile> //system creating #include "creatingdynamicdialog.h" #include "ui_creatingdynamicdialog.h" #include "dynamicdialog.h" //須要動態建立的Ui窗體頭文件 #include "resource/dynamicdialoginresourcefolder.h" CreatingDynamicDialog::CreatingDynamicDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CreatingDynamicDialog) { ui->setupUi(this); SetupConnections(); setAttribute(Qt::WA_DeleteOnClose); } CreatingDynamicDialog::~CreatingDynamicDialog() { delete ui; } void CreatingDynamicDialog::SetupConnections() { connect(ui->btn_create_dynamic_dialog_, &QPushButton::clicked, this, &CreatingDynamicDialog::createDynamicDialog); } void CreatingDynamicDialog::createDynamicDialog() { QUiLoader loader; QFile file(":/form/resource/dynamicdialoginresourcefolder.ui"); if ( !file.open(QFile::ReadOnly)) { return; } //在文件夾下加載ui DynamicDialogInResourceFolder* dialog = (DynamicDialogInResourceFolder*) loader.load(&file, this); //由於Qt自動生成的Ui窗體中沒有Q_Object宏,故沒法使用「qobject_cast」進行轉換。 /*DynamicDialogInResourceFolder* dialog = qobject_cast<DynamicDialogInResourceFolder*>(loader.load(&file, this));*/ //dialog->setModal(false); //dialog->show(); dialog->exec(); }
未完待續