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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值