在编程中,我常常会碰见要根据用户触发按钮,动态生成窗口的状况。在此有两种方法能够动态生成窗口:一:直接在槽函数中调用窗口类。二:将**.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(); }
未完待续