关于QBoxLayout布局内交换两个子控件的位置

说明:

由于Qt的官方文档内,对于QBoxLayout,QgridLayout,或者Qlayout,都找不到类似swapwidget的接口。最近项目中用到,特此记录一下


首先我这边直接继承QHBoxLayout。当然也可以直接QBoxLayout,构造函数传入垂直或水平方向即可。

以下是主要代码:

#ifndef TBOXLAYOUT_H
#define TBOXLAYOUT_H

#include <QObject>
#include <QBoxLayout>
#include <QWidget>
#include <QDebug>
class TBoxLayout : public QHBoxLayout
{
    Q_OBJECT
public:
    explicit TBoxLayout(QWidget *parent);
    ~TBoxLayout();

private:

public:
    bool swapWidget(QWidget* w1,QWidget* w2);
    bool swapWidget(int index1, int index2);

protected:
//    void QDragEnterEvent
};

#endif // TBOXLAYOUT_H

没啥说的,就增加了swapwidget的函数,参数可以是QWidget指针,也可以是在Layout中的序号。

#include "tboxlayout.h"


TBoxLayout::TBoxLayout(QWidget *parent):
    QHBoxLayout(parent)
{

}

TBoxLayout::~TBoxLayout()
{

}

bool TBoxLayout::swapWidget(QWidget *w1, QWidget *w2)
{
    if(!w1 || !w2){
        return false;
    }
    int idx1  = indexOf(w1);
    int idx2  = indexOf(w2);

    qDebug()<<"idx1"<<idx1<<"idx2"<<idx2;
    if(idx1 <0 || idx2 <0){
        return false;
    }
    int stren1 = stretch(idx1);
    int stren2 = stretch(idx2);
    removeWidget(w1);

    QWidget* wid = new QWidget;
    insertWidget(idx1,wid);

    removeWidget(w2);
    insertWidget(idx2,w1,stren1);
    removeWidget(wid);
    insertWidget(idx1,w2,stren2);
    delete wid;
    wid=Q_NULLPTR;

    return true;
}

bool TBoxLayout::swapWidget(int index1, int index2)
{

    if(index1<0 || index1 >=count() || index2<0 || index2 >=count()){
        return false;
    }
    int stren1 = stretch(index1);
    int stren2 = stretch(index2);
    QWidget* w1 = takeAt(index1)->widget();
    QWidget* wid = new QWidget;
    insertWidget(index1,wid);
    QWidget* w2 = takeAt(index2)->widget();
    insertWidget(index2,w1,stren1);

    removeWidget(wid);
    insertWidget(index1,w2,stren2);

    delete wid;
    wid=Q_NULLPTR;

    return true;
}

原理也很简单,new一个空白的widget来填补,防止remove后index发生改变。

使用也很简单:

    mslayout = new TBoxLayout(this);
    mslayout->addWidget(ui->frame);
    mslayout->addWidget(ui->widget);
    mslayout->addWidget(ui->widget_2);
    ui->widget_par->setLayout(mslayout);
```cpp

void MainWindow::on_pushButton_clicked()
{
 //   emit sig_test();
//    mslayout->swapWidget(ui->widget,ui->widget_2);
//    mslayout->swapWidget(ui->frame,ui->widget_2);
    mslayout->swapWidget(0,1);
}

简单测试一下,点击按钮,交换位置,效果如下:

在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值