QTabWidget使用ui設計器在點擊對應tab時創建窗口的做法

    QTabWidget使用ui設計器(俗稱拖控件法)進行UI設計時,如果標籤項比較多,在性能不足的嵌入式設備上窗口的彈出就很慢。如果能夠控制每個標籤頁對應的窗口的創建,那麼只要在顯示時只創建需要顯示的標籤對應窗口就可以了,其它的標籤對應的窗口在使用時才創建,這樣就可以達到加快窗口顯示速度的目的。

    可以按照如下方法實現點擊對應標籤才創建與之對應窗口的功能。

1.在UI設計器中加入QTabWidget控件。

2.每個標籤項對應的窗口都做成獨立的UI資源。在UI對應類的構造函數中把ui->setupUi(this);屏蔽。

3.把QTabWidget中每個標籤項提升爲對應的窗口。

4.每個標籤項對應的窗口類中增加一個創建窗口的函數,執行ui->setupUi(this);。

5.點擊標籤項時如果窗口沒有創建則調用創建窗口的函數。要注意的是創建要按照隱藏標籤項對應窗口-->執行創建窗口函數-->顯示標籤項對應窗口的的步驟。


有一個例子按照上述過程實現了標籤項點擊時創建的功能。程序的功能是這樣的,先創建一個名爲Widget的窗口,Widget上有個PushButton,點擊PushButton彈出一個Dialog,Dialog上面有一個QTabWidget控件,點擊第二標籤時創建與之對應的窗口。


Widget源碼

頭文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

cpp文件

#include "widget.h"
#include "ui_widget.h"
#include "dialog.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    Dialog dlg(this);
    dlg.exec();
}

Dialog頭文件

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    
private slots:
    void on_pushButton_clicked();

    void on_tabWidget_currentChanged(int index);

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

Dialog cpp文件

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    close();
}

void Dialog::on_tabWidget_currentChanged(int index)
{
    if(index == 1)
    {
        if(!ui->tab_2->isCreated())
        {
            ui->tab_2->hide();
            ui->tab_2->createWidget();
            ui->tab_2->show();
        }
    }
}

MyTab2是第二個標籤項對應的窗口,其源碼如下

頭文件

#ifndef MYTAB2_H
#define MYTAB2_H

#include <QWidget>
#include <QLabel>

namespace Ui {
class MyTab2;
}

class MyTab2 : public QWidget
{
    Q_OBJECT
    
public:
    explicit MyTab2(QWidget *parent = 0);
    ~MyTab2();
    
private:
    Ui::MyTab2 *ui;

private:
    bool created;

public:
    bool isCreated();
    void createWidget();
};

#endif // MYTAB2_H

MyTab2 cpp文件

#include "mytab2.h"
#include "ui_mytab2.h"

MyTab2::MyTab2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyTab2)
{
//    ui->setupUi(this);

    created = false;
}

MyTab2::~MyTab2()
{
    delete ui;
}

bool MyTab2::isCreated()
{
    return created;
}

void MyTab2::createWidget()
{
    ui->setupUi(this);

    created = true;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章