需求背景

一个单元楼选择页面,楼栋数量不定,一行显示四个,楼栋太多滚动显示。
实现效果(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版权协议,转载请附上原文出处链接和本声明。