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