Qt实现手动切换多种布局

07-02 1581阅读

引言

之前写了一个手动切换多个布局的程序,下面来记录一下。

程序运行效果如下:

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 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]