QT中QWIDGET动态增加控件

QPushButton *btn = new QPushButton(this);
btn->show();
QPushButton* buttonTest=new QPushButton();//动态创建按钮
  buttonTest->setText("手动添加1111111");
  buttonTest->setParent(this);//设置父控件,有此步骤不需show也可显示
  buttonTest->setGeometry(100,100,100,20);
  //buttonTest->show();//此步骤显示,如果不设父控件则是悬浮于桌面

/****************************

QT创建按钮QPushButton的简单方法

1.头文件
添加头文件

#include <QPushButton>

2.简单代码
(1).第一种方式
QPushButton * btn = new QPushButton; //btn可以自己命名,相当于按钮在代码里面的名字

btn->show();//按钮放入本界面

btn->setParent(this); //按钮的父类

btn->setText("第一个按钮");

(2).第二种方式
QPushButton * btn2 = new QPushButton("第二个按钮",this);

3.移动按钮位置
btn->move(0,0);

4.设置按钮大小
btn->resize(长度,宽度);

5.按钮位置大小
btn->setGeometry(x,y,a,b); //x和y是按钮的位置,a和b是按钮的长和宽
 

/****************************************

1.前言

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

2.实现原理

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

  2. This is an overloaded function.

  3. Sets the size policy of the widget to horizontal and vertical, with standard stretch and no height-for-width.

  4. 将窗口小部件的大小策略设置为水平和垂直,具有标准拉伸,没有高度宽度。

  5. Note: Setter function for property sizePolicy.

 
  1. QSizePolicy::Preferred

  2. The sizeHint() is best, but the widget can be shrunk and still be useful. The widget can be expanded,

  3. but there is no advantage to it being larger than sizeHint() (the default QWidget policy).

  4. 缺省大小是最佳效果,部件允许放大或缩小,但不倾向于扩展比sizeHint()大(QWidget的缺省策略)。

3.代码实现

 
  1. //pushbutton铺满widget

  2. // QWidget -> QVBoxLayout -> QPushButton->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred)

  3. QWidget * widget = new QWidget(this);

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

  5. QPushButton *btn = new QPushButton();

  6. btn->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);//铺满布局

  7. layout->addWidget(btn);

  8. 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。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值