Qt GridLayout动态添加控件

需求背景

在这里插入图片描述
一个单元楼选择页面,楼栋数量不定,一行显示四个,楼栋太多滚动显示。

实现效果(DEMO)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

gif录制原因,其实清除时并不会有白色残留。

关键代码

	#define COL 4           //每行楼栋显示个数
    QVector<QPushButton*>   mVecButton;
    int32_t                 mMaxBuildings;          /** 楼栋总数 */ 
    int32_t                 mSelectedBtn;           /** 当前选择的楼栋 */
===============================================
if(mMaxBuildings == 0){
        return;
    }

    QString commStyle = QString("QPushButton{%1;} QPushButton:checked{%2} \n")
            .arg(radius_skin(8) + gray_hangyanbk_skin + boldfont_skin(24) + blackfg_hangyan_skin)
            .arg(radius_skin(8) + bluebk_skin + boldfont_skin(24) + whitefg_skin);

    mVecButton.clear();
    int maxBulidingCount = getMaxBuilding();

    QSignalMapper * clickMapper = new QSignalMapper(this);   
    QPushButton * btn[maxBulidingCount];
    for(int i = 0 ; i < maxBulidingCount; ++i){
        btn[i] = new QPushButton(ui->builidingWidget);
        btn[i]->setText(QString::number(i + 1) + ntr("幢").c_str());
        btn[i]->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
        btn[i]->setStyleSheet(commStyle);
        btn[i]->setCheckable(true);
        mVecButton.push_back(btn[i]);
        connect(mVecButton[i], SIGNAL(clicked()), clickMapper, SLOT(map()));
        clickMapper->setMapping(mVecButton[i], i);
        mVecButton[i]->installEventFilter(this);
    }
    mVecButton[0]->setChecked(true);   //默认选择第一幢
    connect(clickMapper, SIGNAL(mapped(int)), this, SLOT(widgetClick(int)));  

    int colCount = COL;

    int iitem = 0;  //余数
    int row = 0;

    //只显示一行的时候
    if(mMaxBuildings <= colCount){
        row = 1;
        colCount = mMaxBuildings;
        iitem = colCount;

        for(int i = 0 ; i < COL; ++i){
            ui->gridLayout->addWidget(mVecButton.at(i),0,i,1,1);
            ui->gridLayout->setSpacing(16);
            //显示一行总幢数小于COL时也要显示四个,大于总幢数的地方用透明按钮做填充,否则会显示异常
            if(i >= mMaxBuildings){
                btn[i]->setText("");
                btn[i]->setStyleSheet(transbg_skin);
                btn[i]->setEnabled(false);
            }
        }
        return;
    }else{
        iitem = mMaxBuildings % COL;
        row = mMaxBuildings / COL;
        //如果有余数则向上取整  说明最后一行幢数小于规定的数目;余数则是最后一行要显示的幢数个数
        if(iitem){
            row+=1;
        }
    }

    qDebug()<<row;

    int itemIndex = 0;

    //行数
    for(int i = 0;i < row; ++i){
        int btnIndx=0;
        //如果是最后一次循环且最后行元素不是初始col个,则重新赋值col
        if(i + 1 == row && iitem){
            colCount = iitem;
            qDebug()<<" colCount "<<colCount;
        }
        //列数
        for(int j = 0;j < colCount; j++){
            ui->gridLayout->addWidget(mVecButton.at(itemIndex),i,j + btnIndx);
            ++itemIndex;
            ++btnIndx;
        }
    }
    ui->gridLayout->setSpacing(16);

版权声明:本文为qq_43627385原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。