将qlabel放到数组中

之前通过拖拽label显示在区域范围内的功能中,通过for循环初始化qlabel,但想要操作控制时,无法定位到,所以把label都放到数组中。
错误的方法:
一开始想的太简单,像下面这样做,结果不行。
mainwindow.h中:

//头文件
#include <QLabel>
#include <QPushButton>
//创建控件数组
QPushButton *button[10];
QLabel *qlabel_group[64];

mainwindow.cpp中:

qlabel_group[qlabel_nm-1] = new QLabel(ui->groupBox_4);

qlabel_group[qlabel_nm-1]->setGeometry(((qlabel_nm-1)%9+1)*100+((qlabel_nm-1)%9-1)*60+70,120*((qlabel_nm-1)/9+1)-40,60,60);
qlabel_group[qlabel_nm-1]->setStyleSheet("border:2px solid black;");
qlabel_group[qlabel_nm-1]->show();

结果反而显示不了了。

使用方法:
使用容器来存放QLabel

mainwindow.h中:

//头文件
#include <QLabel>
//设置容器
//QList和QVector二选一
QList<QLabel*> qlab_group; 
//QVector<QLabel*> qlab_group;

QListQVectorQLinkedList三种容器的区别:https://blog.csdn.net/navyqh/article/details/52679930

mainwindow.cpp中:

qlab_group.push_back(new QLabel(ui->groupBox_4));

qlab_group[qlabel_nm-1]->setGeometry(((qlabel_nm-1)%9+1)*100+((qlabel_nm-1)%9-1)*60+70,120*((qlabel_nm-1)/9+1)-40,60,60);
qlab_group[qlabel_nm-1]->setStyleSheet("border:2px solid black;");
qlab_group[qlabel_nm-1]->show();

由于push_back(_X)等同于insert(end(),_X)
所以也可以:

qlab_group.insert(qlab_group.end(),new QLabel(ui->groupBox_4));

接着就可以使用数组对这些label进行控制了。

示范
1、这是我写的一个鼠标释放事件,已经完成了鼠标拖拽放置qlabel。如下代码在拖拽完成后,会在区域内相对位置放置一个qlabel,最大放置数为63(9*7)个,为了展示qlabel的控制,在拖拽个数大于63次时,第七个label的边框粗细会变为10px。(qlabel_nm需要先置0,因为数组是从0开始的,不置0会报错out of range

//鼠标释放事件
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
    if (clicked_label_signal == true)
    {
        //设置鼠标样式
        this->setCursor(Qt::ArrowCursor);          //改变鼠标样式为小拳拳
        clicked_label_signal = false;             //label拖拽点击信号
        if (e->x()>305 && e->x()<1905 && e->y()>86 && e->y()<1071)       //label放置区域
        {
            qlabel_nm++;      //label个数,初值设为0
            if (qlabel_nm<64)    //label最大个数
            {
                //qlab_group.push_back(new QLabel(ui->groupBox_4));
                qlab_group.insert(qlab_group.end(),new QLabel(ui->groupBox_4));      //新生成的qlabel加入数组末尾
                //label显示的位置
                qlab_group[qlabel_nm-1]->setGeometry(((qlabel_nm-1)%9+1)*100+((qlabel_nm-1)%9-1)*60+70,120*((qlabel_nm-1)/9+1)-40,60,60);
                //label粗细为2px
                qlab_group[qlabel_nm-1]->setStyleSheet("border:2px solid black;");
                qlab_group[qlabel_nm-1]->show();
            }
            //当拖拽个数大于63时,第七个label的粗细变为10px
            else{
                qlab_group[6]->setStyleSheet("border:10px solid black;");
            }
        }
    }
}

运行结果:
在这里插入图片描述
这样就实现了定位到某个label进行控制。

2、生成指定个数的label方格:

//在mainwindow.h中
QList<QLabel*> qlab_group1;
int qlab_nm1;
//在mainwindow.cpp中,直接写在ui中即可
for(qlab_nm1=1;qlab_nm1<46;qlab_nm1++)
    {
        qlab_group1.insert(qlab_group1.end(),new QLabel(ui->groupBox_3));
        qlab_group1[qlab_nm1-1]->setGeometry(30+((qlab_nm1-1)%5)*155,30+((qlab_nm1-1)/5)*105,70,30);
        qlab_group1[qlab_nm1-1]->setStyleSheet("border:2px solid black;border-radius:1px;background-color:rgb(128,128,128,128);");
        qlab_group1[qlab_nm1-1]->show();
     }

运行结果:
在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐