QT中QWidget动态增加控件

Stella981
• 阅读 1375

环境:
QT版本:5.6.2


1.前言

QWidget动态增加控件,并且铺满控件。

2.实现原理

void QWidget::setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)

This is an overloaded function.
Sets the size policy of the widget to horizontal and vertical, with standard stretch and no height-for-width.
将窗口小部件的大小策略设置为水平和垂直,具有标准拉伸,没有高度宽度。

Note: Setter function for property sizePolicy. 



QSizePolicy::Preferred

The sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, 
but there is no advantage to it being larger than sizeHint() (the default QWidget policy).
缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。

3.代码实现

//pushbutton铺满widget
// QWidget -> QVBoxLayout -> QPushButton->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred)

QWidget * widget = new QWidget(this);

QVBoxLayout * layout = new QVBoxLayout(widget);//铺满布局

QPushButton *btn = new QPushButton();
btn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);//铺满布局

layout->addWidget(btn);

 ui->horizontalLayoutChoose->addWidget(widget);

4.结果

QT中QWidget动态增加控件


动态增加和动态删除QWidget内控件(有布局和没有布局都有效)(qDeleteAll、delete、deleteLater、findChildren)

在QWidget界面中,不管是否采用了布局,只要是QWidget的子类,则可以用findchild()函数查找所有子类,然后通过指定函数进行删除。下面是博主总结的两种动态删除dget内控件的方法。

一、通过函数qDeleteAll()删除

其中,该函数原型有两个,分别如下:

  1. //第一个原型

  2. template <typename ForwardIterator>

  3. Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)

  4. {

  5. while (begin != end) {

  6. delete *begin;

  7. ++begin;

  8. }

  9. }

  10. //第二个原型

  11. template <typename Container>

  12. inline void qDeleteAll(const Container &c)

  13. {

  14. qDeleteAll(c.begin(), c.end());

  15. }

由上可知,第二个原型是调用第一个原型,其中第一个原型是通过迭代器,用delete来删除指定的控件类。

1.2用法如下

博主要删除指定QWidget界面内所有的QLabel子类,步骤如下

1.2.1新建一个QWidget工程,勾选UI界面,然后在UI界面内随意拖进几个QLabel,如下图所示

QT中QWidget动态增加控件
1.2.2在按钮槽函数添加如下代码

  1. void Widget::on_pushButton_clicked()

  2. {

  3. qDeleteAll(this->findChildren<QObject *>());

  4. }

该函数的功能是删除QWidget内所有子类QObject和子类QObject的继承类。

1.2.3结果如下图所示

QT中QWidget动态增加控件

二、通过槽函数deleteLater或者delete删除

2.1思路原理讲解

可以用QWidget::findChildren找到QWidget所有子类,然后用迭代函数遍历QWidget所有子类,选择要删除的控件。该方式的优点是可以选择指定删除的控件和类型,不想删除的可以保留下来。其中,findChildren原型如下:

  1. template<typename T>

  2. inline QList<T> findChildren(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

  3. {

  4. typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;

  5. QList<T> list;

  6. qt_qFindChildren_helper(this, aName, ObjType::staticMetaObject,

  7. reinterpret_cast<QList<void *> *>(&list), options);

  8. return list;

  9. }

通过函数findchildren可以获取QWidget内类型为T的所有子类。

2.2用法示例

接着上面的功能,将上面按钮槽函数的代码替换如下:

  1. void Widget::on_pushButton_clicked()

  2. {

  3. QList<QLabel*> labels = this->findChildren<QLabel*>();

  4. foreach(QLabel* label, labels)

  5. {

  6. if("保留控件" == label->objectName())//不想删除的控件

  7. continue;

  8. label->deleteLater(); //或者用delete wdg;也行

  9. }

  10. update(); //不加好像也可以

  11. }

  12. void Widget::on_pushButton_2_clicked()

  13. {

  14. //在QWidget内动态增加QLabel子控件代码

  15. static int count=1;

  16. QLabel *labelD1=new QLabel(QString("labelD%1").arg(count),this);

  17. labelD1->setFixedSize(100,50);

  18. labelD1->setGeometry(100+count,200+count,100,50);

  19. labelD1->show();

  20. count+=5;

  21. }

2.3结果如下图所示

QT中QWidget动态增加控件

有结果可知,博主正确增加和删除QWidget内所有子控件QLabel。

参考内容:

https://bbs.csdn.net/topics/390512834(参考:删除所有控件qDeleteAll)

https://blog.csdn.net/qiangzi4646/article/details/97263481(参考:delete删除QWidget内所有子控件QPushbutton)

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Ricky Ricky
3年前
PyQt5 快速开发与实战(二)
3.4信号与槽关联1.信号signal与slot是Qt的核心机制。2.如何为控件发射的信号指定对应的处理槽函数?1.在窗口的UI设计中添加信号
Wesley13 Wesley13
3年前
visualize_object_model_3d显示3维图像的问题
原问题:我把halcon代码导出成C代码。并在QT中调用。其中用到了visualize\_object\_model\_3d但是,目前只能单独弹出一个窗口来显示3维图像,不能在QT的控件框中显示。像这样单独在一个窗口中显示,是可以的。!Halcon与QT混合编程CQT中使用visualize_object_model_3d显示
Stella981 Stella981
3年前
ALV Tree
找相关的alvtreedemo:se38bcalv\_tree\1.创建对话屏幕由于ALV没有专门实现的控件,需要先在对话屏幕100上增加一个用户自定义控件区域(CustomControl),名为CONTAINER1!(https://oscimg.oschina.net/oscnet/ed7c8537b24e1a1c
Stella981 Stella981
3年前
QT中QString与string的转化,解决中文乱码问题
在QT中,使用QString输出到控件进行显示时,经常会出现中文乱码,网上查了一圈,发现大部分都是针对QT4增加4条语句:</spancppviewplaincopyQTextCodeccodecQTextCodec::codecForName("UTF8");QTextCo
Wesley13 Wesley13
3年前
JavaFX入门:简单Demo
零、最终目标通过两种方式(纯代码控制、FXML),实现一个简单的登录界面:Paste\_Image.png涉及到的控件:文本(Text,动态显示内容)、标签(Label,显示文本)、文本域(TextField,用户交互输入)、按钮(Button,登录点击)一、控件通过Code动态添加实现方法
Stella981 Stella981
3年前
Qt自定义控件大全+designer源码
抽空将自定义控件的主界面全部重写了一遍,采用左侧树状节点导航,看起来更精美高大上一点,后期准备单独做个工具专用每个控件的属性设计,其实qt自带的designer就具备这些功能,于是从qt4的源码中抽取出来,总共才1MB不到,不得不佩服Qt公司的程序员,写的很厉害。特意将自定义控件作为插件封装到了designer中,打开designer就从左侧控件栏中可以看到
Stella981 Stella981
3年前
Qt编写自定义控件16
前言五一期间一直忙着大屏电子看板软件的开发,没有再去整理控件,今天已经将大屏电子看板的所有子窗口都实现了任意停靠和双击独立再次双击最大化等功能,过阵子有空再写一篇文章介绍其中的技术点。魔法老鼠控件,来自Qt自带的demo,我只是将其修改了部分颜色接口等。实现的功能1:可设置身体眼睛眼珠鼻子尾巴的颜色2:
Stella981 Stella981
3年前
Qt5中表格处理大数据量
在Qt中如果是普通项目,GUI处理展现的数据量不大,一般用QTableWidget,QTreeWidget这样的控件就满足了,但是如果数据量行数达到了几万行,那么Widget的展示性能就偏差了。Qt中提供了一种Model/View的编程方式来处理数据,也就是展示层和数据层分离,这样就解耦了。一旦Model的状态改变,它会自动渲染到View控件。这样的机制