在编程中,我经常会遇见要根据用户触发按钮,动态生成窗口的情况。在此有两种方法可以动态生成窗口:一:直接在槽函数中调用窗口类。二:将 **.ui 添加到资源文件,通过 QUiLoader 加载。
现将两种方法介绍如下。
在 Qt 中创建 Qt 设计师界面类
一:
1)在函数中实例化窗体 gotocelldialog(也可以不用指针,直接创建变量 gotocelldialog)
2)使用 show 或 exec 方法将其以非模态 / 模态显示。
3)如果是实例化,在退出函数后应使用 delete 释放资源。
void MainWindow::GoToCell()
{
if ( !dialog_) {
dialog_ = new GoToCellDialog(this);
}
if (dialog_->exec()) {
....
}
//以下两句可以不写,因为dialog_为类变量,当第一次实例化后,只要程序不退出,dialog_就可一直使用
delete dialog_;
dialog_ = 0;
}
二:
1)创建一个 UI 窗体,添加到工程的资源文件中。
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
调用UI文件。
#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();
}