Qt中动态加载窗口

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

 

未完待续

相关文章
相关标签/搜索