Qt中动态加载窗口

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

 

#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();
}

 

未完待续

转载于:https://my.oschina.net/weiweiqiao/blog/1503500

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值