在Qt设计多个切换页面时,经常会出现多个页面用到相同的控件,此时就会涉及到控件复用。尤其是当一个复杂子界面需要在多个页面反复出现时,我们往往不希望复制多份(那样比较冗余),此时就需要研究如何让控件或者子界面随着页面的切换反复利用。下面以QStackedWidget中同一日历对象的反复调用为例,介绍如何操作。
1.UI设计师里的控件排布
页面一
页面二
页面三
我们可以看到,除过第一个页面外,其余两个页面都没有日历控件,现在我们要做的就是复用这个日历。
另外,为了让comboBox和下面的翻页关联,这里添加一下信号与槽:
为了让控件能够自适应界面的放大缩小,这里需要设置一下:
最小尺寸的长与宽(这里是433,511)来自默认布局下geometry里的数据!
2.代码部分
实现控件复用的关键点是要使用信号与槽机制,每切换一次页面,发送一个信号,界面实时加载复用控件。
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtReuse.h"
class QtReuse : public QMainWindow
{
Q_OBJECT
public:
QtReuse(QWidget* parent = nullptr);
~QtReuse();
signals:
void loadCalendar(int index);
public slots:
void slot_loadCalendar(int i);
void slot_currentIndexChanged(int index);
private:
Ui::QtReuseClass ui;
QGridLayout* gridLayout1;
QGridLayout* gridLayout2;
};
#include "QtReuse.h"
#pragma execution_character_set("utf-8")
QtReuse::QtReuse(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
ui.comboBox->addItem("页面 一");
ui.comboBox->addItem("页面 二");
ui.comboBox->addItem("页面 三");
ui.comboBox->setCurrentIndex(0);
gridLayout1 = new QGridLayout(ui.widget);
gridLayout2 = new QGridLayout(ui.widget_2);
connect(ui.comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_currentIndexChanged(int)));
connect(this, SIGNAL(loadCalendar(int)), this, SLOT(slot_loadCalendar(int)));
}
QtReuse::~QtReuse()
{
}
void QtReuse::slot_loadCalendar(int i)
{
if (i == 0)
{
ui.gridLayout0->addWidget(ui.calendarWidget);
}
if (i == 1)
{
gridLayout1->addWidget(ui.calendarWidget);
}
if (i == 2)
{
gridLayout2->addWidget(ui.calendarWidget);
}
}
void QtReuse::slot_currentIndexChanged(int index)
{
ui.stackedWidget->setCurrentIndex(index);
emit loadCalendar(index);
}
3.最终效果
页面一
页面二
页面三
在页面一里,刻意将日期调到2024年一月12日,然后切换页面,发现页面二和页面三都是这个日期,说明用的是一个控件对象,复用成功!