QT中QWidget动态增加控件

环境:
QT版本:5.6.2


1.前言

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

2.实现原理

1void QWidget::setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical) 2 3This is an overloaded function. 4Sets the size policy of the widget to horizontal and vertical, with standard stretch and no height-for-width. 5将窗口小部件的大小策略设置为水平和垂直,具有标准拉伸,没有高度宽度。 6 7Note: Setter function for property sizePolicy. 8 9 10 11QSizePolicy::Preferred 12 13The sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded, 14but there is no advantage to it being larger than sizeHint() (the default QWidget policy). 15缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。

3.代码实现

1//pushbutton铺满widget 2// QWidget -> QVBoxLayout -> QPushButton->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred) 3 4QWidget * widget = new QWidget(this); 5 6QVBoxLayout * layout = new QVBoxLayout(widget);//铺满布局 7 8QPushButton *btn = new QPushButton(); 9btn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);//铺满布局 10 11layout->addWidget(btn); 12 13 ui->horizontalLayoutChoose->addWidget(widget);

4.结果

在这里插入图片描述


动态增加和动态删除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,如下图所示


1.2.2在按钮槽函数添加如下代码

  1. void Widget::on_pushButton_clicked()

  2. {

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

  4. }

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

1.2.3结果如下图所示

二、通过槽函数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结果如下图所示

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

参考内容:

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

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

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

PyQt5 快速开发与实战(二)

3.4信号与槽关联1.信号signal与slot是Qt的核心机制。2.如何为控件发射的信号指定对应的处理槽函数?1.在窗口的UI设计中添加信号

ALV Tree

找相关的alvtreedemo:se38bcalv\_tree\1.创建对话屏幕由于ALV没有专门实现的控件,需要先在对话屏幕100上增加一个用户自定义控件区域(CustomControl),名为CONTAINER1!(https://oscimg.oschina.net/oscnet/ed7c8537b24e1a1c

QT中QString与string的转化,解决中文乱码问题

在QT中,使用QString输出到控件进行显示时,经常会出现中文乱码,网上查了一圈,发现大部分都是针对QT4增加4条语句:</spancppviewplaincopyQTextCodeccodecQTextCodec::codecForName("UTF8");QTextCo

JavaFX入门:简单Demo

零、最终目标通过两种方式(纯代码控制、FXML),实现一个简单的登录界面:Paste\_Image.png涉及到的控件:文本(Text,动态显示内容)、标签(Label,显示文本)、文本域(TextField,用户交互输入)、按钮(Button,登录点击)一、控件通过Code动态添加实现方法