精华内容
下载资源
问答
  • Qt 之 findChild

    万次阅读 多人点赞 2016-08-04 20:04:03
    简述在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都...findChild 描述 示例 分析 效果 源码 情况查找选项 枚举Qt::FindChildOption: Qt::FindChildOptions是一个QFlags<FindChildOption>类型定义,它存

    简述

    在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    查找选项

    • 枚举Qt::FindChildOption:

    Qt::FindChildOptions是一个QFlags<FindChildOption>类型定义,它存储一个或FindChildOption的组合值。

    常量描述
    Qt::FindDirectChildrenOnly0x0查找object的直接孩子
    Qt::FindChildrenRecursively0x1查找object的所有孩子(递归搜索)

    findChild

    描述

    返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。默认执行递归搜索,除非指定选FindDirectChildrenOnly。

    T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

    如果有一个以上的孩子匹配搜索,返回最直接的祖先。如果有几个直系祖先,没有定义哪一个将被返回。这种情况下,应该使用findChildren()。

    示例

    这个示例,返回parentWidget中一个名为“button1”的QPushButton孩子,即使按钮不是父亲的直接孩子:

    QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

    这个示例,返回parentWidget中的一个QListWidget孩子:

    QListWidget *list = parentWidget->findChild<QListWidget *>();

    这个示例,返回parentWidget(它的直接父亲)中一个名为“button1”的QPushButton孩子:

    QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);

    这个示例,返回parentWidget(它的直接父亲)中的一个QListWidget孩子:

    QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);

    我们不妨来分析一下!

    分析

    假如我们有一个主界面,主界面上有一个文本为“Parent”的QGroupBox,“Parent”中包含了两个部件及另外一个文本为“Child”的QGroupBox,“Child”中包含了另外两个部件,它们之间的关系如下:

    这里写图片描述

    用程序实现一下,大概就是下面这个效果。

    效果

    这里写图片描述

    源码

    // 构建部件
    QGroupBox *parentWidget = new QGroupBox(this);
    QGroupBox *subWidget = new QGroupBox(this);
    
    QCheckBox *pCheckBox1 = new QCheckBox(parentWidget);
    QCheckBox *pCheckBox2 = new QCheckBox(parentWidget);
    QCheckBox *pCheckBox3 = new QCheckBox(subWidget);
    QCheckBox *pCheckBox4 = new QCheckBox(subWidget);
    
    //设置标题
    parentWidget->setTitle("Parent");
    subWidget->setTitle("Child");
    
    // 设置文本
    pCheckBox1->setText("CheckBox1");
    pCheckBox2->setText("CheckBox2");
    pCheckBox3->setText("CheckBox3");
    pCheckBox4->setText("CheckBox4");
    
    // 设置objectName
    pCheckBox1->setObjectName("name");
    pCheckBox2->setObjectName("name1");
    pCheckBox3->setObjectName("name");
    pCheckBox4->setObjectName("name2");
    
    // 为subWidget设置布局,这时pCheckBox3、pCheckBox4均为它的孩子
    QVBoxLayout *pSubLayout = new QVBoxLayout();
    pSubLayout->addWidget(pCheckBox3);
    pSubLayout->addWidget(pCheckBox4);
    pSubLayout->setSpacing(10);
    pSubLayout->setContentsMargins(10, 10, 10, 10);
    subWidget->setLayout(pSubLayout);
    
    // 为parentWidget设置布局,这时pCheckBox1、pCheckBox2、以及subWidget均为它的孩子。
    QVBoxLayout *pLayout = new QVBoxLayout();
    pLayout->addWidget(pCheckBox1);
    pLayout->addWidget(pCheckBox2);
    pLayout->addWidget(subWidget);
    pLayout->setSpacing(10);
    pLayout->setContentsMargins(10, 10, 10, 10);
    parentWidget->setLayout(pLayout);

    到这里,如果对父子级联关系还有问题,你不妨可以调试一下看看:

    qDebug() << parentWidget;
    qDebug() << checkBox1->parent();
    qDebug() << checkBox2->parent();
    qDebug() << subWidget->parent();
    
    qDebug() << "******************";
    
    qDebug() << subWidget;
    qDebug() << checkBox3->parentWidget();
    qDebug() << checkBox4->parentWidget();

    输出如下:

    QGroupBox(0x802778)
    QGroupBox(0x802778)
    QGroupBox(0x802778)
    QGroupBox(0x802778)
    ******************
    QGroupBox(0x802a90)
    QGroupBox(0x802a90)
    QGroupBox(0x802a90)

    这说明什么情况?很显然:

    • checkBox3、checkBox4的直接父亲是subWidget。
    • checkBox1、checkBox2、subWidget的直接父亲是parentWidget。

    由此可以确定,parentWidget是checkBox3、checkBox4的爷爷(祖先),O(∩_∩)O~。

    可能情况

    • 返回NULL

      • 不能转换为类型T - 与Qt::FindChildOption取值无关。
      QPushButton *button = parentWidget->findChild<QPushButton *>();

      parentWidget所有子孙部件中包含QGroupBox和QCheckBox,但是并没有QPushButton,所以无论是否递归搜索,均返回NULL。

      • 可以转换为类型T,但是对应的name不存在 - 与Qt::FindChildOption取值无关。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("Qt");

      parentWidget上有QCheckBox,但是没有名为“Qt”的,所以无论是否递归搜索,均返回NULL。

      • 可以转换为类型T,对应的name也存在(非直接孩子) - Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name2", Qt::FindDirectChildrenOnly);

      parentWidget上有名为“name2”的QCheckBox,但是由于采用了Qt::FindDirectChildrenOnly,只会查找直接孩子,而直接孩子中只有名为“name”和“name1”的QCheckBox,所以返回NULL。

    • 返回非NULL

      硬性条件:

      1.可以转换为类型T。
      2.对应的name存在(如果name为空字符串,此条件可忽略,只需要参考1)。

      • Qt::FindChildOption取值为Qt::FindChildrenRecursively。
      QCheckBox *checkBox1 = parentWidget->findChild<QCheckBox *>("name1");
      QCheckBox *checkBox2 = parentWidget->findChild<QCheckBox *>("name2");

      由于递归查找,当发现孩子中存在符合要求的就会终止,由于直接孩子中存在名为“name1”的QCheckBox,所以checkBox1表示文本为“CheckBox2”的QCheckBox;由于子孙孩子中存在名为“name2”的QCheckBox,所以checkBox2表示文本为“CheckBox4”的QCheckBox。

      • Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name", Qt::FindDirectChildrenOnly);

      由于采用了Qt::FindDirectChildrenOnly,只会查找parentWidget的直接孩子,直接孩子中存在名为“name”的QCheckBox,所以返回文本为“CheckBox1”的QCheckBox。

    注意:

    1. 理解直接与非直接孩子的区别与关系(可以想象一下血缘关系)。
    2. name是按照objectName()来查找的,并不是text(),切勿搞错。
    展开全文
  • 当已知控件的 objectName 时,想要获取此控件的对象并修改其属性,这时可通过findChild 函数来实现。 原型 findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::...

    简介

    当已知控件的 objectName 时,想要获取此控件的对象并修改其属性,这时可通过 findChild 函数来实现。

    原型

    findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

    举例

    当 ui 界面中存在 9 个 QPushButton,objectName 依次是 Mode1_Btn、Mode2_Btn、Mode3_Btn、Mode4_Btn、Mode5_Btn、Mode6_Btn、Mode7_Btn、Mode8_Btn、Mode9_Btn。可通过 findChild 函数将它们的对象存放在一个集合中。

    QVector<QPushButton *> vecModeBtns;
    m_vecModeBtns.resize(9+1);
    for(int i = 1; i <= 9; i++)
    	vecModeBtns[i] = findChild<QPushButton *>("Mode" + QString::number(i) +"_Btn");
    
    //修改Mode5_Btn的文本
    vecModeBtns[5]->setText("NewMode5");

     

    展开全文
  • findChild函数说明 T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const 参数1: QString 对象名(objectName) 参数2: Qt::...

    findChild函数说明

    T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

    参数1: QString
    对象名(objectName)

    参数2: Qt::FindChildOptions

    ConstantValueDescription
    Qt::FindDirectChildrenOnly0x0只查看对象的直接子对象
    Qt::FindChildrenRecursively0x1查看对象的所有子对象(递归搜索)

    示例

    查找objectName为button1的QPushButton
    QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
    
    查找父类下所有的子对象
    QListWidget *list = parentWidget->findChild<QListWidget *>();
    
    查找父类下objectName为button1的直接子对象
    QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);
    
    查找父类下所有的直接子对象
    QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);
    

    findChildren 函数说明

    QList< T > QObject::findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

    findChildren 跟 findChild 区别是findChildren 返回的是list
    展开全文
  • Qt之findChild

    2016-08-04 20:04:00
    在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。 简述 查找选项 findChild 描述 示例 分析 ...

    简述

    在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。

    查找选项

    • 枚举Qt::FindChildOption:

    Qt::FindChildOptions是一个QFlags<FindChildOption>类型定义,它存储一个或FindChildOption的组合值。

    常量描述
    Qt::FindDirectChildrenOnly0x0查找object的直接孩子
    Qt::FindChildrenRecursively0x1查找object的所有孩子(递归搜索)

    findChild

    描述

    返回对象中类型可以转换为T,并且名为name的孩子。如果不满足条件,则返回0。默认执行递归搜索,除非指定选FindDirectChildrenOnly。

    T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

    如果有一个以上的孩子匹配搜索,返回最直接的祖先。如果有几个直系祖先,没有定义哪一个将被返回。这种情况下,应该使用findChildren()。

    示例

    这个示例,返回parentWidget中一个名为“button1”的QPushButton孩子,即使按钮不是父亲的直接孩子:

    QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

    这个示例,返回parentWidget中的一个QListWidget孩子:

    QListWidget *list = parentWidget->findChild<QListWidget *>();

    这个示例,返回parentWidget(它的直接父亲)中一个名为“button1”的QPushButton孩子:

    QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);

    这个示例,返回parentWidget(它的直接父亲)中的一个QListWidget孩子:

    QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);

    我们不妨来分析一下!

    分析

    假如我们有一个主界面,主界面上有一个文本为“Parent”的QGroupBox,“Parent”中包含了两个部件及另外一个文本为“Child”的QGroupBox,“Child”中包含了另外两个部件,它们之间的关系如下:

    这里写图片描述

    用程序实现一下,大概就是下面这个效果。

    效果

    这里写图片描述

    源码

    // 构建部件
    QGroupBox *parentWidget = new QGroupBox(this);
    QGroupBox *subWidget = new QGroupBox(this);
    
    QCheckBox *pCheckBox1 = new QCheckBox(parentWidget);
    QCheckBox *pCheckBox2 = new QCheckBox(parentWidget);
    QCheckBox *pCheckBox3 = new QCheckBox(subWidget);
    QCheckBox *pCheckBox4 = new QCheckBox(subWidget);
    
    //设置标题
    parentWidget->setTitle("Parent");
    subWidget->setTitle("Child");
    
    // 设置文本
    pCheckBox1->setText("CheckBox1");
    pCheckBox2->setText("CheckBox2");
    pCheckBox3->setText("CheckBox3");
    pCheckBox4->setText("CheckBox4");
    
    // 设置objectName
    pCheckBox1->setObjectName("name");
    pCheckBox2->setObjectName("name1");
    pCheckBox3->setObjectName("name");
    pCheckBox4->setObjectName("name2");
    
    // 为subWidget设置布局,这时pCheckBox3、pCheckBox4均为它的孩子
    QVBoxLayout *pSubLayout = new QVBoxLayout();
    pSubLayout->addWidget(pCheckBox3);
    pSubLayout->addWidget(pCheckBox4);
    pSubLayout->setSpacing(10);
    pSubLayout->setContentsMargins(10, 10, 10, 10);
    subWidget->setLayout(pSubLayout);
    
    // 为parentWidget设置布局,这时pCheckBox1、pCheckBox2、以及subWidget均为它的孩子。
    QVBoxLayout *pLayout = new QVBoxLayout();
    pLayout->addWidget(pCheckBox1);
    pLayout->addWidget(pCheckBox2);
    pLayout->addWidget(subWidget);
    pLayout->setSpacing(10);
    pLayout->setContentsMargins(10, 10, 10, 10);
    parentWidget->setLayout(pLayout);

    到这里,如果对父子级联关系还有问题,你不妨可以调试一下看看:

    qDebug() << parentWidget;
    qDebug() << checkBox1->parent();
    qDebug() << checkBox2->parent();
    qDebug() << subWidget->parent();
    
    qDebug() << "******************";
    
    qDebug() << subWidget;
    qDebug() << checkBox3->parentWidget();
    qDebug() << checkBox4->parentWidget();

    输出如下:

    QGroupBox(0x802778)
    QGroupBox(0x802778)
    QGroupBox(0x802778)
    QGroupBox(0x802778)
    ******************
    QGroupBox(0x802a90)
    QGroupBox(0x802a90)
    QGroupBox(0x802a90)

    这说明什么情况?很显然:

    • checkBox3、checkBox4的直接父亲是subWidget。
    • checkBox1、checkBox2、subWidget的直接父亲是parentWidget。

    由此可以确定,parentWidget是checkBox3、checkBox4的爷爷(祖先),O(∩_∩)O~。

    可能情况

    • 返回NULL

      • 不能转换为类型T - 与Qt::FindChildOption取值无关。
      QPushButton *button = parentWidget->findChild<QPushButton *>();

      parentWidget所有子孙部件中包含QGroupBox和QCheckBox,但是并没有QPushButton,所以无论是否递归搜索,均返回NULL。

      • 可以转换为类型T,但是对应的name不存在 - 与Qt::FindChildOption取值无关。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("Qt");

      parentWidget上有QCheckBox,但是没有名为“Qt”的,所以无论是否递归搜索,均返回NULL。

      • 可以转换为类型T,对应的name也存在(非直接孩子) - Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name2", Qt::FindDirectChildrenOnly);

      parentWidget上有名为“name2”的QCheckBox,但是由于采用了Qt::FindDirectChildrenOnly,只会查找直接孩子,而直接孩子中只有名为“name”和“name1”的QCheckBox,所以返回NULL。

    • 返回非NULL

      硬性条件:

      1.可以转换为类型T。
      2.对应的name存在(如果name为空字符串,此条件可忽略,只需要参考1)。

      • Qt::FindChildOption取值为Qt::FindChildrenRecursively。
      QCheckBox *checkBox1 = parentWidget->findChild<QCheckBox *>("name1");
      QCheckBox *checkBox2 = parentWidget->findChild<QCheckBox *>("name2");

      由于递归查找,当发现孩子中存在符合要求的就会终止,由于直接孩子中存在名为“name1”的QCheckBox,所以checkBox1表示文本为“CheckBox2”的QCheckBox;由于子孙孩子中存在名为“name2”的QCheckBox,所以checkBox2表示文本为“CheckBox4”的QCheckBox。

      • Qt::FindChildOption取值为Qt::FindDirectChildrenOnly。
      QCheckBox *checkBox = parentWidget->findChild<QCheckBox *>("name", Qt::FindDirectChildrenOnly);

      由于采用了Qt::FindDirectChildrenOnly,只会查找parentWidget的直接孩子,直接孩子中存在名为“name”的QCheckBox,所以返回文本为“CheckBox1”的QCheckBox。

    注意:

    1. 理解直接与非直接孩子的区别与关系(可以想象一下血缘关系)。
    2. name是按照objectName()来查找的,并不是text(),切勿搞错。
    展开全文
  • Qt查找孩子findChild

    2017-12-11 11:00:00
    在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -“查找孩子”。 简述 查找选项 findChild 描述 示例...
  • ext js findChild

    2010-11-11 10:33:05
    最近做了一个程序模块,...var node = TreePanel.root.findChild( String attribute, Mixed value ) ; 但是我调用了方法之后 火狐一直报错 node为null; 后来安装了spket之后 翻看源代码 findChild : function(att...
  • Unity Transform.Find与Transform.FindChild的关系 两者完全没有区别,用法完全一致。 唯一的不同就是 Transform.FindChild目前在文档中已经查不到。估计是官方已经用Transform.Find取代了它。Transform....
  • Qt中findChild函数可以很方便的实现这一步骤。 代码说明: 用QLabel模拟IO信号灯,需要在读取到低电平时让IO信号灯呈现绿色。 UI中Label的名字统一为"led_x"( x为数字 ). for(int i=0; i<16; i++) { // label...
  • 函数findChild()为我们提供了查找指定指针的办法,其函数原型如下: T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const 释义 这是...
  • 由于版本问题,所以新版的寻找物体的子物体对应的方法从transform.FindChild改到了transform.Find,两者的区别也很直观,如果直接调用FindChild("子物体"),而现在用Find则为Find("父物体/子物体&...
  • 根据设置的Name标示查找组件的对象,关键函数:setObjectName()/findChild()   findChild()/2:需要两个参数,  参数一:组件的类型,如QLineEdit、QPushButton。  参数二:setObjectName()设置的Name标示。   ...
  • Unity3d Find/FindChild 不到对象

    千次阅读 2016-04-26 16:13:15
    今天在测试工具时候出现个问题,Find / FindChild 一直找不到对象,找了下原因,是因为我们配置的时候的文件名字带有 " / " 比如: 配置文件中配置有 A/B/C 这样的文件名字,然后去find 的时候就会发现一直会报错为...
  • 在普通情况下,GameObject.Find以及Transform.Find和Transform.FindChild是可以做到相同的功能,但是他们有本质上的区别,望新手谨记:GameObject.Find是遍历整个当前场景,挨个查找,效率偏低,非特殊情况一般不要...
  • 1.1已经知道一个QPushbutton的objectName,可以根据该objectName查找到对应的...findChild(const QString &amp;aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const   1....
  • 在普通情况下,GameObject.Find以及Transform.Find和Transform.FindChild是可以做到相同的功能,但是他们有本质上的区别,望新手谨记: GameObject.Find是遍历整个当前场景,挨个查找,效率偏低,非特殊情况一般...
  • 连下拉出来的控件先日期都用不了,明显不合预期,我只是禁止左边那个显示日期区域不能输入,一种方法是设置焦点属性为noFous,另一个方法比较麻烦,但可以学会findchild的使用方法 ui->EndEdit->dumpObjectTree(); ...
  • Unity中的Find和FindChild

    千次阅读 2019-01-16 18:15:11
    https://answers.unity.com/questions/52560/gameobjectfind-work-on-inactive-objects.html GameObject.Find()只能找到active的物体 Transform.Find()和Transform.FindChild()能找到active为false的物体,其中...
  • 在Qt中,凡是在一个类中new的对象只要在当前类的对象的生命周期内未被delete,都可以通过findChild()函数找到这个new出的对象,查找时,需传递一个QString的参数。 动态布局窗体,需要动静结合,窗体的外布局通过...
  • QLabel *label = ui->widget->findChild*>(str); label->setText("1111"); //如果一个容器中存放着多组数据,在ui上是同一种类型并且命名有序的控件时,就可以用以上代码处理同一种业务逻辑,就不用使用大量的...
  • 参见英文答案 >jQuery: How to get to a particular child of a parent?5个当我点击expandable-icons-cancel时,我想保存form-group div的子标签.这是结构: Long Title 功能:jQuery('.expandable-ico...
  • 今天要获取每个lineedit的内容,发现了太麻烦了, str[0] = ui->lE_Temp1->text();...QLineEdit* lE=findChild*>("lE_Temp"+QString::number(i)); if(lE!=NULL) qDebug() << lE->text(); }  
  • name指的是objeName,而不是id Text { id: abcd x: 44 y: 27 text: qsTr("HelloWorld") font.pixelSize: 12 objectName: "hello" }
  • 在Unity开发游戏中我们经常会遇到通过路径去找到我们想要的节点,Unity的API中给我们提拱了三个方法(题目中的三个),但是这三个又略有不同,其中后两个我们可以认为是相同的,在Unity2017里后两个方法好像已经合并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,991
精华内容 1,196
关键字:

findchild