qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
---恢复内容开始---
qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分,上半部分为5个按钮,点击5个按钮,下半部分分别会动态的出现不同的label显示内容。(显示内容为:2017到2018欧冠十六强队伍)效果如下图所示:效果如下图所示:
这个其实是一个很简单的例子,我写这个例子的最重要的目的是让大家来体会第二列的动态生成的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 <QLabel>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);
}
- 大家可能会对“QString pu = 0x6D66;s_PremierLeague<<"利物"+ pu;”,这种类似的操作感到好奇,其实我这个是解决中文乱码问题的一个办法,如果各位如果有比这个还好的解决中文乱码的方法也可以留言展示一拨儿。
- 其实实现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转换的时候就会报错。这块儿的话应该和内部实现有关系,没有时间深入进去看。各位想探究的朋友可以留言讨论。
- 其实我在写这个小例子的时候还碰到了一个很无脑的错误,不过之前一直没有注意到,那就是:在MainWindow之下setLayout是不起作用的,断断续续写qt也写了挺长时间了,竟然没有发现这个错误。解决方法就是:
centerWindow = new QWidget();this->setCentralWidget(centerWindow);
项目源代码下载
点击下载
下载地址:https://download.csdn.net/download/qq130106486/10707414
---恢复内容结束---
qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分,上半部分为5个按钮,点击5个按钮,下半部分分别会动态的出现不同的label显示内容。(显示内容为:2017到2018欧冠十六强队伍)效果如下图所示:效果如下图所示:
这个其实是一个很简单的例子,我写这个例子的最重要的目的是让大家来体会第二列的动态生成的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 <QLabel>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);
}
- 大家可能会对“QString pu = 0x6D66;s_PremierLeague<<"利物"+ pu;”,这种类似的操作感到好奇,其实我这个是解决中文乱码问题的一个办法,如果各位如果有比这个还好的解决中文乱码的方法也可以留言展示一拨儿。
- 其实实现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转换的时候就会报错。这块儿的话应该和内部实现有关系,没有时间深入进去看。各位想探究的朋友可以留言讨论。
- 其实我在写这个小例子的时候还碰到了一个很无脑的错误,不过之前一直没有注意到,那就是:在MainWindow之下setLayout是不起作用的,断断续续写qt也写了挺长时间了,竟然没有发现这个错误。解决方法就是:
centerWindow = new QWidget();this->setCentralWidget(centerWindow);
项目源代码下载
点击下载
下载地址:https://download.csdn.net/download/qq130106486/10707414
转载于:https://www.cnblogs.com/qinzhikai/p/9758180.html
qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示相关推荐
- VC程序中实现控件的动态生成与响应
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框, ...
- 基于qt中QCalendarWidget的双日历时间范围选择控件(自定义)
控件预览: 控件基于QT设计,单击日历设置时间范围起点,再次单击日历设置时间范围终点: 当起止时间为同一天时,所选日期右上角显示"单"字样: 控件设计说明: 控件基于QT中QDia ...
- qt中label双击_qt关于QLabel控件的实现双击调用文件对话框
这里是手动添加以QLabel为基类c++类,重载mouseDoubleClickEvent()nlabel.h #ifndef NLABEL_H #define NLABEL_H #include c ...
- Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)
文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...
- Android入门(二)——常见布局与控件
文章目录 一.常见界面布局 1.线性布局 LinearLayout 2.相对布局 RelativeLayout 3.表格布局 TableLayout 4.帧布局 FrameLayout 二.常见界面控 ...
- qt中创建控件布局以及删除原有布局和控件
引言 当根据数据来创建控件并布局时,如果数据更新,那么之前创建的控件便需要删除后重新创建布局.该文主要说明将原来的布局和控件删除,重新创建并布局. 示例 先看一下ui文件: 下面是实现代码: void ...
- java 控件内布局_Java开发桌面程序学习(二)————fxml布局与控件学习
JavaFx项目 新建完项目,我们的项目有三个文件 Main.java 程序入口类,载入界面并显示 Controller.java 事件处理,与fxml绑定 Sample.fxml 界面 sample ...
- Android中列表框纵向布局,andriod布局常用控件属性..docx
andriod布局常用控件属性. android:gravity="center_vertical" ?限定它里面的内容要垂直居中显示.?android:layout_gravit ...
- QT 布局,控件自适应大小 自动缩放 自动布局
有时,我们需要我们的布局或控件,随窗口变化而变化:这时就要求我们注意一下: 1. 先来说简单的布局控件自适应 首先拖动两个 verticalLayout 放到窗口: 右击空白处:右键菜单 ->布 ...
最新文章
- vim文本编辑器使用技巧
- struts2配置default-properties
- python批量删缩进_Python工具PyCharm常用快捷键
- hamcrest_重新设计Hamcrest
- android 7.0 解锁亮屏,Android7.0亮屏流程分析
- 《学习OpenCV》课后习题解答(第四章)(仅供参考)(不断更新)
- maven打包忽略注解_maven打包后pom.properties中的注释问题-阿里云开发者社区
- 64centos安装mysql_CentOS7 64位安装mysql教程,亲测完美
- [Java] 蓝桥杯BASIC-30 基础练习 阶乘计算
- WireShark帧格式解析
- LINUX登录界面,输入密码,循环重启出现
- 探讨【IGE】的源代码【二】。
- 高效好用视频加密软件的4个特点
- 小球碰撞(理解ing)
- navicat12.1.18破解 亲测
- 如何把Win7系统桌面上的内容保存在非系统盘
- CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)
- java flip_GitHub - bowen903/ViewFlipAnimator: 一种超简单纯Java实现的卡片翻转效果
- matlabrobert锐化_Matlab图像处理系列3———空间域锐化滤波器
- 2019 初入IT十年(下)---- 视线所及只剩生活
热门文章
- Golang sync.pool对象池
- flexible.js 移动端自适应方案
- Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统
- Hyper-v 开启嵌套虚拟化的方法
- C语言宏定义##连接符和#符的使用
- undefined reference to `__isnanf'
- 推荐几个 Go 测试工具和技巧让你在虎年如虎添翼
- 假期把技术书籍和焦虑放一边,我做了几天...
- Laravel核心解读 -- 外观模式
- java中来获取UUID