1.概要
畫面中有一處位置,有個按鈕點擊后,這片位置完全換成另一個畫面,這中情況特別適合用堆棧布局。
//堆棧布局的應用
#include <QStackedLayout>
QStackedLayout *layout = new QStackedLayout(this);
layout->setCurrentIndex(0);?
//信號和槽的鏈接
QPushButton *foundButton = findChild<QPushButton *>("pushButton_2");
? ? if (foundButton) {
? ? ? ? // 連接點擊事件
? ? ? ? connect(foundButton, &QPushButton::clicked, this, &FormMy1::onButtonClicked);
? ? }
private slots:
? ? void onButtonClicked();
2.代碼
2.1?FormMy1
#ifndef FORMMY1_H
#define FORMMY1_H#include <QWidget>
#include <QStackedLayout>namespace Ui {
class FormMy1;
}class FormMy1 : public QWidget
{Q_OBJECTpublic:QStackedLayout *layout;explicit FormMy1(QWidget *parent = nullptr);~FormMy1();
private slots:void onButtonClicked();
private:Ui::FormMy1 *ui;
};#endif // FORMMY1_H
#include "formmy1.h"
#include "ui_formmy1.h"
#include <QPushButton>FormMy1::FormMy1(QWidget *parent): QWidget(parent), ui(new Ui::FormMy1)
{ui->setupUi(this);// 根據名稱查找按鈕QPushButton *foundButton = findChild<QPushButton *>("pushButton_2");if (foundButton) {// 連接點擊事件connect(foundButton, &QPushButton::clicked, this, &FormMy1::onButtonClicked);}
}void FormMy1::onButtonClicked() {// 處理按鈕點擊事件//qDebug("Button clicked!");layout->setCurrentIndex(1);
}FormMy1::~FormMy1()
{delete ui;
}
2.2?FormMy2
#ifndef FORMMY2_H
#define FORMMY2_H#include <QWidget>
#include <QStackedLayout>namespace Ui {
class FormMy2;
}class FormMy2 : public QWidget
{Q_OBJECTpublic:QStackedLayout *layout;explicit FormMy2(QWidget *parent = nullptr);~FormMy2();
private slots:void onButtonClicked();
private:Ui::FormMy2 *ui;
};#endif // FORMMY2_H
?
#include "formmy2.h"
#include "ui_formmy2.h"FormMy2::FormMy2(QWidget *parent): QWidget(parent), ui(new Ui::FormMy2)
{ui->setupUi(this);// 根據名稱查找按鈕QPushButton *foundButton = findChild<QPushButton *>("pushButton");if (foundButton) {// 連接點擊事件connect(foundButton, &QPushButton::clicked, this, &FormMy2::onButtonClicked);}
}void FormMy2::onButtonClicked() {// 處理按鈕點擊事件//qDebug("Button clicked!");layout->setCurrentIndex(0);
}FormMy2::~FormMy2()
{delete ui;
}
2.3?FormStacked
#ifndef FORMSTACKED_H
#define FORMSTACKED_H#include <QWidget>namespace Ui {
class FormStacked;
}class FormStacked : public QWidget
{Q_OBJECTpublic:explicit FormStacked(QWidget *parent = nullptr);~FormStacked();private:Ui::FormStacked *ui;
};#endif // FORMSTACKED_H
#include "formstacked.h"
#include "ui_formstacked.h"
#include <QStackedLayout>
#include "formmy1.h"
#include "formmy2.h"FormStacked::FormStacked(QWidget *parent): QWidget(parent), ui(new Ui::FormStacked)
{ui->setupUi(this);QStackedLayout *layout = new QStackedLayout(this);FormMy1* my1 = new FormMy1(this);my1->layout = layout;FormMy2* my2 = new FormMy2(this);my2->layout = layout;layout->addWidget(my1);layout->addWidget(my2);layout->setCurrentIndex(0); // 初始顯示第二個窗口部件//this->setLayout(layout);
}FormStacked::~FormStacked()
{delete ui;
}
?
2.4?Widget
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H
?
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}
2.5?main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
3.運行結果
?