Qt多页面时的控件复用——以QStackedWidget为例

       在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日,然后切换页面,发现页面二和页面三都是这个日期,说明用的是一个控件对象,复用成功!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,QStackedWidgetQt提供的一个用于管理多个页面控件。它可以将多个QWidget类型的子控件叠放在一起,并在需要切换它们的显示,从而实现界面切换的效果。具体来说,QStackedWidget有以下几个特点: 1. 可以添加多个QWidget类型的子控件,每个子控件都代表一个页面。 2. 可以通过setCurrentWidget()函数来设置当前显示的页面。 3. 可以通过currentIndex()函数获取当前显示的页面的索引。 4. 可以通过addWidget()函数添加子控件,也可以通过insertWidget()函数在指定位置插入子控件。 下面是一个简单的示例代码,演示了如何使用QStackedWidget实现界面切换的效果: ```cpp #include <QApplication> #include <QWidget> #include <QPushButton> #include <QStackedWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个QStackedWidget控件 QStackedWidget stackedWidget; // 创建多个QWidget类型的子控件,每个子控件代表一个页面 QWidget page1(&stackedWidget); QWidget page2(&stackedWidget); QWidget page3(&stackedWidget); // 在每个页面中添加一个按钮,用于切换到其他页面 QPushButton btn1("Page 1", &page1); QPushButton btn2("Page 2", &page2); QPushButton btn3("Page 3", &page3); // 设置按钮的大小和位置 btn1.setGeometry(50, 50, 100, 50); btn2.setGeometry(50, 50, 100, 50); btn3.setGeometry(50, 50, 100, 50); // 将子控件添加到QStackedWidgetstackedWidget.addWidget(&page1); stackedWidget.addWidget(&page2); stackedWidget.addWidget(&page3); // 设置QStackedWidget的大小和位置 stackedWidget.setGeometry(0, 0, 800, 600); // 绑定按钮的点击事件处理函数,用于切换页面 QObject::connect(&btn1, &QPushButton::clicked, [&]() { stackedWidget.setCurrentWidget(&page1); }); QObject::connect(&btn2, &QPushButton::clicked, [&]() { stackedWidget.setCurrentWidget(&page2); }); QObject::connect(&btn3, &QPushButton::clicked, [&]() { stackedWidget.setCurrentWidget(&page3); }); // 设置初始显示的页面 stackedWidget.setCurrentWidget(&page1); // 显示QStackedWidget控件 stackedWidget.show(); return app.exec(); } ``` 在这份代码中,我们创建了一个QStackedWidget控件,并在其中添加了三个QWidget类型的子控件,每个子控件代表一个页面。在每个页面中,我们添加了一个QPushButton类型的按钮,用于切换到其他页面。通过setCurrentWidget()函数,我们可以在按钮的点击事件处理函数中切换到相应的页面。最后,我们将QStackedWidget控件显示出来,启动应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值