Qt实现手动切换多种布局
引言
之前写了一个手动切换多个布局的程序,下面来记录一下。
程序运行效果如下:
示例
需求
通过点击程序界面上不同的布局按钮,使主工作区呈现出不同的页面布局,多个布局之间可以通过点击不同布局按钮切换。支持的最多的窗口为9个。不同布局下窗口数随之变化。
开发环境
使用的QtCreator12.0.2,基于Qt5.15.2库开发。
代码实现
创建基于QApplication的应用程序。
下面是实现代码:
main.cpp
#include "manullayoutdialog.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); ManulLayoutDialog w; w.show(); ObjectPooling*m_pool = ObjectPooling::getInstance(9); return a.exec(); }
ObjectPooling.h
#ifndef OBJECTPOOLING_H #define OBJECTPOOLING_H #include #include #include class ObjectPooling:public QObject { Q_OBJECT private: ObjectPooling(qint32 num); ObjectPooling(const ObjectPooling &) = delete; ObjectPooling& operator=(const ObjectPooling&)=delete; public: static ObjectPooling *getInstance(qint32 num); ~ObjectPooling(); QWidget* takeOut(); void putIn(QWidget *pWidget); int getSize()const; private: QVector m_vecWidget; }; #endif // OBJECTPOOLING_H
ObjectPooling.cpp
#include "objectpooling.h" #include ObjectPooling::ObjectPooling(qint32 num):QObject() { for(int i = 0; i setStyleSheet("background-color:back;"); m_vecWidget.push_back(pWidget); } } } ObjectPooling *ObjectPooling::getInstance(qint32 num) { static ObjectPooling instance(num); return &instance; } ObjectPooling::~ObjectPooling() { if(m_vecWidget.size() if(*it){ delete *it; (*it) = nullptr; } } m_vecWidget.clear(); } QWidget *ObjectPooling::takeOut() { if(m_vecWidget.size()){ QWidget*pWidget = m_vecWidget.back(); // qDebug() m_vecWidget.push_back(pWidget); } int ObjectPooling::getSize() const { return m_vecWidget.size(); } class ManulLayoutDialog; } QT_END_NAMESPACE class ManulLayoutDialog : public QDialog { Q_OBJECT public: ManulLayoutDialog(QWidget *parent = nullptr); ~ManulLayoutDialog(); private: void initLayout(); void clearLastLayout(int n);//n——新的布局中窗口的总数 void threeColumnLayout(int r,int c);//r——行数,c——列数 private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); private: Ui::ManulLayoutDialog *ui; qint32 m_n;//布局中窗口的总个数 QVector ui-setupUi(this); initLayout(); } ManulLayoutDialog::~ManulLayoutDialog() { for(QWidget *pWidget:m_vecWidget){ pWidget-setParent(nullptr);//不设置被回收的窗口父对象为空,会被再次释放 ObjectPooling::getInstance(9)-putIn(pWidget); } m_vecWidget.clear(); delete ui;//若被回收的窗口没有设置父对象为空,这里会析构该窗口,回收到对象池后会再次析构 } void ManulLayoutDialog::initLayout() { QHBoxLayout *pHLayout = new QHBoxLayout(ui-widget); pHLayout-setContentsMargins(0,0,0,0); QWidget *pWidget = ObjectPooling::getInstance(9)-takeOut(); pHLayout-addWidget(pWidget); m_n = 1; m_vecWidget.push_back(pWidget); m_pool = ObjectPooling::getInstance(9); } void ManulLayoutDialog::clearLastLayout(int n) { QLayout *pLayout = ui-widget-layout(); // qDebug() for(int i =0; i //趟数 //移除窗口中的控件,回收到对象池 QWidget *pWidget = m_vecWidget.back(); if(pLayout && pWidget){ qDebug() //为了防止二次重设父对象,先将上一次的父对象清空 for(auto it = m_vecWidget.begin();it != m_vecWidget.end();++it){ if(*it){ (*it)-setParent(nullptr); } } for(int i = 0; i
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。