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