qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示[通俗易懂]

qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示[通俗易懂]恢复内容开始qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分,上半部分为5

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

—恢复内容开始—

#qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分,上半部分为5个按钮,点击5个按钮,下半部分分别会动态的出现不同的label显示内容。(显示内容为:2017到2018欧冠十六强队伍)效果如下图所示:效果如下图所示: ![点击“英超”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-9f1c160e81843ae7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![点击“西甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-29fa03e674e605f7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![点击“法甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-390683d70ea5ecf4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![点击“意甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-32694abd99cc6476.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![点击“德甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-e3c65840bc3318f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  这个其实是一个很简单的例子,我写这个例子的最重要的目的是让大家来体会第二列的动态生成的layout,其中的控件是lable。 ## 1.重写你动态界面中需要存放的控件。  首先呢,最重要的一个实现就是对QLabel类进行一次封装,当你对这个类进行封装之后,这个QLabel类才可以重复的去new。 “` #include “teamnamelabel.h”

TeamNameLabel::TeamNameLabel(QString name)
{
this->setText(name);
this->setFixedSize(70,20);
}

###头文件
PS:在头文件的定义中有一个坑需要注意一下,那就是**Q_OBJECT**。这处缺失的话在之后的**qobject_cast**转换的时候,编译的时候是会报错的。这个是其中比较大的一个坑。

ifndef TEAMNAMELABEL_H

define TEAMNAMELABEL_H

include

class TeamNameLabel : public QLabel
{
Q_OBJECT
public:
TeamNameLabel(QString name);
};

endif // TEAMNAMELABEL_H

##2.在主布局文件中相关的实现。
**先直接上代码再说吧!**

include “mainwindow.h”

include <windows.h>

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)

{

this->setFixedSize(500,300);

this->InitUi();

s_PremierLeague<<“曼城”;

QString pu = 0x6D66;

s_PremierLeague<<“利物”+ pu;

s_PremierLeague<<“热刺”;

QString qie = 0x5207;

s_PremierLeague<<qie+”尔西”;

s_PremierLeague<<“曼联”;

QString de = 0x5FB7;

QString huang = 0x7687;

QString li = 0x91CC;

s_LaLiga<<“皇家马德” + li;

s_LaLiga<<“巴塞罗那”;

s_LaLiga<<“塞维利亚”;

s_Liguel<<“巴黎圣日耳曼”;

s_SerieA<<“尤文图斯”;

s_SerieA<<“罗马”;

s_Bundesliga<<“拜仁”;

}

MainWindow::~MainWindow()
{

}

void MainWindow::InitUi()
{
//注意setlayout在MainWindow中是不起作用的
centerWindow = new QWidget();
this->setCentralWidget(centerWindow);
v = new QVBoxLayout(this);
h_up = new QHBoxLayout(this);
h_down = new QHBoxLayout(this);
m_PremierLeague = new QPushButton(this);
m_PremierLeague->setText(“英超”);
connect(m_PremierLeague,SIGNAL(clicked(bool)),this,SLOT(clickPremierLeague()));
h_up->addWidget(m_PremierLeague);
m_LaLiga = new QPushButton(“西甲”,this);
m_Ligue1 = new QPushButton(“法甲”,this);
m_SerieA = new QPushButton(“意甲”,this);
m_Bundesliga = new QPushButton(“德甲”,this);
h_up->addWidget(m_LaLiga);
connect(m_LaLiga,SIGNAL(clicked(bool)),this,SLOT(clickLaLiga()));
h_up->addWidget(m_Ligue1);
connect(m_Ligue1,SIGNAL(clicked(bool)),this,SLOT(clickLigue1()));
h_up->addWidget(m_SerieA);
connect(m_SerieA,SIGNAL(clicked(bool)),this,SLOT(clickSerieA()));
h_up->addWidget(m_Bundesliga);
connect(m_Bundesliga,SIGNAL(clicked(bool)),this,SLOT(clickBundesliga()));
v->addLayout(h_up);
v->addLayout(h_down);
centerWindow->setLayout(v);
}

void MainWindow::DynamicLayout(QStringList name)
{
//判断此布局内的控件个数
if(h_down->count() > 0)
{
int count = h_down->count();
for(int i = count-1 ; i >= 0 ; i –)
{
QLayoutItem *it = h_down->layout()->takeAt(i);
TeamNameLabel oldHistory = qobject_cast<TeamNameLabel>(it->widget());
if(oldHistory != NULL)
delete oldHistory;
}
}
if(name.size() > 0)
{
for(int i = 0 ; i < name.size() ; i++)
{
TeamNameLabel *team = new TeamNameLabel(name[i]);
h_down->addWidget(team);
}
}
}

void MainWindow::clickPremierLeague()
{
DynamicLayout(s_PremierLeague);
}

void MainWindow::clickLaLiga()
{
DynamicLayout(s_LaLiga);
}

void MainWindow::clickLigue1()
{
DynamicLayout(s_Liguel);
}

void MainWindow::clickSerieA()
{
DynamicLayout(s_SerieA);
}

void MainWindow::clickBundesliga()
{
DynamicLayout(s_Bundesliga);
}

1. 大家可能会对“*QString pu = 0x6D66;s_PremierLeague<<"利物"+ pu;”*,这种类似的操作感到好奇,其实我这个是解决中文乱码问题的一个办法,如果各位如果有比这个还好的解决中文乱码的方法也可以留言展示一拨儿。
2. 其实实现QHBoxLayout布局内控件的动态显示的核心函数实现就是**DynamicLayout**。这个函数的核心的思路分为俩个部分,第一步就是先将原来布局内已经存在的控件先进行清空,第二步进行动态的控件生成。其中在清空布局内原有的控件时,有一个较大的坑,那就是:
    for(int i = count-1 ; i >= 0 ; i --)
    {
        QLayoutItem *it = h_down->layout()->takeAt(i);
        TeamNameLabel *oldHistory = qobject_cast<TeamNameLabel*>(it->widget());
        if(oldHistory != NULL)
            delete oldHistory;
    }
看到这里很多朋友可能还想不到这能有什么坑,事实上,刚开始的时候,我在写这个循环的时候,i的取值我是从0开始的,问题就出现在这块儿了,当你i从0开始取值的时候,在进行最后一次**qobject_cast**转换的时候就会报错。这块儿的话应该和内部实现有关系,没有时间深入进去看。各位想探究的朋友可以留言讨论。
3. 其实我在写这个小例子的时候还碰到了一个很无脑的错误,不过之前一直没有注意到,那就是:在MainWindow之下setLayout是不起作用的,断断续续写qt也写了挺长时间了,竟然没有发现这个错误。解决方法就是:
centerWindow = new QWidget();
this->setCentralWidget(centerWindow);
##项目源代码下载

[点击下载](https://download.csdn.net/download/qq130106486/10707414)

下载地址:https://download.csdn.net/download/qq130106486/10707414


<p>---恢复内容结束---</p>#qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分,上半部分为5个按钮,点击5个按钮,下半部分分别会动态的出现不同的label显示内容。(显示内容为:2017到2018欧冠十六强队伍)效果如下图所示:效果如下图所示:
![点击“英超”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-9f1c160e81843ae7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![点击“西甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-29fa03e674e605f7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![点击“法甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-390683d70ea5ecf4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![点击“意甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-32694abd99cc6476.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![点击“德甲”按钮之后](https://upload-images.jianshu.io/upload_images/14361146-e3c65840bc3318f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
&emsp;这个其实是一个很简单的例子,我写这个例子的最重要的目的是让大家来体会第二列的动态生成的layout,其中的控件是lable。
## 1.重写你动态界面中需要存放的控件。
&emsp;首先呢,最重要的一个实现就是对QLabel类进行一次封装,当你对这个类进行封装之后,这个QLabel类才可以重复的去new。

include “teamnamelabel.h”

TeamNameLabel::TeamNameLabel(QString name)
{
this->setText(name);
this->setFixedSize(70,20);
}

###头文件
PS:在头文件的定义中有一个坑需要注意一下,那就是**Q_OBJECT**。这处缺失的话在之后的**qobject_cast**转换的时候,编译的时候是会报错的。这个是其中比较大的一个坑。

ifndef TEAMNAMELABEL_H

define TEAMNAMELABEL_H

include

class TeamNameLabel : public QLabel
{
Q_OBJECT
public:
TeamNameLabel(QString name);
};

endif // TEAMNAMELABEL_H

##2.在主布局文件中相关的实现。
**先直接上代码再说吧!**

include “mainwindow.h”

include <windows.h>

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)

{

this->setFixedSize(500,300);

this->InitUi();

s_PremierLeague<<“曼城”;

QString pu = 0x6D66;

s_PremierLeague<<“利物”+ pu;

s_PremierLeague<<“热刺”;

QString qie = 0x5207;

s_PremierLeague<<qie+”尔西”;

s_PremierLeague<<“曼联”;

QString de = 0x5FB7;

QString huang = 0x7687;

QString li = 0x91CC;

s_LaLiga<<“皇家马德” + li;

s_LaLiga<<“巴塞罗那”;

s_LaLiga<<“塞维利亚”;

s_Liguel<<“巴黎圣日耳曼”;

s_SerieA<<“尤文图斯”;

s_SerieA<<“罗马”;

s_Bundesliga<<“拜仁”;

}

MainWindow::~MainWindow()
{

}

void MainWindow::InitUi()
{
//注意setlayout在MainWindow中是不起作用的
centerWindow = new QWidget();
this->setCentralWidget(centerWindow);
v = new QVBoxLayout(this);
h_up = new QHBoxLayout(this);
h_down = new QHBoxLayout(this);
m_PremierLeague = new QPushButton(this);
m_PremierLeague->setText(“英超”);
connect(m_PremierLeague,SIGNAL(clicked(bool)),this,SLOT(clickPremierLeague()));
h_up->addWidget(m_PremierLeague);
m_LaLiga = new QPushButton(“西甲”,this);
m_Ligue1 = new QPushButton(“法甲”,this);
m_SerieA = new QPushButton(“意甲”,this);
m_Bundesliga = new QPushButton(“德甲”,this);
h_up->addWidget(m_LaLiga);
connect(m_LaLiga,SIGNAL(clicked(bool)),this,SLOT(clickLaLiga()));
h_up->addWidget(m_Ligue1);
connect(m_Ligue1,SIGNAL(clicked(bool)),this,SLOT(clickLigue1()));
h_up->addWidget(m_SerieA);
connect(m_SerieA,SIGNAL(clicked(bool)),this,SLOT(clickSerieA()));
h_up->addWidget(m_Bundesliga);
connect(m_Bundesliga,SIGNAL(clicked(bool)),this,SLOT(clickBundesliga()));
v->addLayout(h_up);
v->addLayout(h_down);
centerWindow->setLayout(v);
}

void MainWindow::DynamicLayout(QStringList name)
{
//判断此布局内的控件个数
if(h_down->count() > 0)
{
int count = h_down->count();
for(int i = count-1 ; i >= 0 ; i –)
{
QLayoutItem *it = h_down->layout()->takeAt(i);
TeamNameLabel oldHistory = qobject_cast<TeamNameLabel>(it->widget());
if(oldHistory != NULL)
delete oldHistory;
}
}
if(name.size() > 0)
{
for(int i = 0 ; i < name.size() ; i++)
{
TeamNameLabel *team = new TeamNameLabel(name[i]);
h_down->addWidget(team);
}
}
}

void MainWindow::clickPremierLeague()
{
DynamicLayout(s_PremierLeague);
}

void MainWindow::clickLaLiga()
{
DynamicLayout(s_LaLiga);
}

void MainWindow::clickLigue1()
{
DynamicLayout(s_Liguel);
}

void MainWindow::clickSerieA()
{
DynamicLayout(s_SerieA);
}

void MainWindow::clickBundesliga()
{
DynamicLayout(s_Bundesliga);
}

1. 大家可能会对“*QString pu = 0x6D66;s_PremierLeague<<"利物"+ pu;”*,这种类似的操作感到好奇,其实我这个是解决中文乱码问题的一个办法,如果各位如果有比这个还好的解决中文乱码的方法也可以留言展示一拨儿。
2. 其实实现QHBoxLayout布局内控件的动态显示的核心函数实现就是**DynamicLayout**。这个函数的核心的思路分为俩个部分,第一步就是先将原来布局内已经存在的控件先进行清空,第二步进行动态的控件生成。其中在清空布局内原有的控件时,有一个较大的坑,那就是:
    for(int i = count-1 ; i >= 0 ; i --)
    {
        QLayoutItem *it = h_down->layout()->takeAt(i);
        TeamNameLabel *oldHistory = qobject_cast<TeamNameLabel*>(it->widget());
        if(oldHistory != NULL)
            delete oldHistory;
    }
看到这里很多朋友可能还想不到这能有什么坑,事实上,刚开始的时候,我在写这个循环的时候,i的取值我是从0开始的,问题就出现在这块儿了,当你i从0开始取值的时候,在进行最后一次**qobject_cast**转换的时候就会报错。这块儿的话应该和内部实现有关系,没有时间深入进去看。各位想探究的朋友可以留言讨论。
3. 其实我在写这个小例子的时候还碰到了一个很无脑的错误,不过之前一直没有注意到,那就是:在MainWindow之下setLayout是不起作用的,断断续续写qt也写了挺长时间了,竟然没有发现这个错误。解决方法就是:
centerWindow = new QWidget();
this->setCentralWidget(centerWindow);
##项目源代码下载

[点击下载](https://download.csdn.net/download/qq130106486/10707414)

下载地址:https://download.csdn.net/download/qq130106486/10707414
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167367.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 嵌入式软件工程师待遇怎么样

    嵌入式软件工程师待遇怎么样本来大家选择嵌入式也就是冲着嵌入式的发展前景不错而来,所以在嵌入式这块还是有很多不知道的知识,这些也都要等着老师去给你讲解了,下面先来了解下嵌入式软件工程师待遇怎么样吧。嵌入式软件工程师待遇怎么样:1、应届毕业生如果你是在一线城市的话,有人带你,你自己有比较学的好,那么你的薪资待遇就可以达到6k+,但是不同公司不同待遇,而且不同地区不同的薪资待遇,就像北上广,这些地区薪资待遇是比其他地区高出2k以上,甚至更高的。就像人家阿里,那工资肯定就比其他公司要高的多。所以得看你要去什么地方发展了,但是平均

    2022年9月14日
    3
  • python图像处理实战_数字图像处理与python实现pdf下载

    python图像处理实战_数字图像处理与python实现pdf下载数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、图像顶帽运算和图像底帽运算、骨架抽取、形态学梯度、Top-hat变换等。万字长文整理,希望对您有所帮助。该系列文章是讲解PythonOpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    2022年10月14日
    3
  • qca wlan wifi modules 解析一

    qca wlan wifi modules 解析一分析lsdk-ap121lsdk-ap134源码:https://github.com/hades13/lsdk_ar9531包含wifidrivers另一wifidrivers版本:https://download.csdn.net/download/nolycjyf/3722308目录结果:appsbuilddriversincludemodulesbo…

    2022年7月27日
    14
  • 3D打印上位机软件

    3D打印上位机软件本文将主要介绍在3D打印中常见的3D打印上位机软件,这类3D软件将为用户提供较大的帮助,通过对这类软件的分类,用户可以选择使用最适合自己的软件。没有恐惧,我们已经回答了所有这些问题,以及熟练程度的细节和可以下载的细节。最重要的是,他们大多数是完全免费和开源的。我们错过了您最喜爱的3D打印软件吗?让我们在评论中知道,我们会在将来的更新中添加它们。1、curaCura可以被称…

    2022年5月31日
    64
  • oracle ebs 12.20 安装成功其过程失败日记及总结(1)

    oracle ebs 12.20 安装成功其过程失败日记及总结(1)

    2021年12月15日
    45
  • ubuntu怎么卸载docker_failed to start docker.service

    ubuntu怎么卸载docker_failed to start docker.serviceDocker卸载及安装(CentOS7)1.卸载:#停止docker服务systemctlstopdocker#查看当前所有版本安装信息rpm-qa|grepdocker#yumlistinstalled|grepdocker#docker-ce-cli-20.10.12-3.el7.x86_64#docker-ce-20.10.11-3.el7.x86_64#docker-scan-plugin-0.12.0-3.el7.x86_64#docker-ce-

    2025年10月3日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号