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

 

未完待續

相關文章
相關標籤/搜索