Qt::FindDirectChildren 不起作用,但应该

问题描述 投票:0回答:1

我在使用 Qt 对象树时遇到了一些问题。我有一个继承自

RangeValidator
ValidatorInterface
。我在堆上创建它并将父级与其耦合以进行内存管理。这位家长是
SettingsForm

但是,即使新的

RangeValidator
直接耦合到表单(使用“this”),它似乎并没有将其视为直接子级。它只能递归地找到它。您可以在调试器的“本地”选项卡中看到这一点。

请注意,

RangeValidator
对象是
SettingsForm
的直接子对象。我已在
QObject::children
下检查了调试器。

有人知道这是怎么回事吗?我似乎无法弄清楚这一点。

code and debug info

编辑: 看起来与

QString& name
参数有关。当将其更改为空字符串(又称全部匹配)时,它确实会直接并递归地找到它。之前的递归发现实际上是假的。我不知道 setObjectName() 如何无法像我预期的那样使用。

//finds the child
BalVfpValidatorInterface* childDirect = this->findChild<BalVfpValidatorInterface*>(QString(), Qt::FindDirectChildrenOnly);
//does not find the child
BalVfpValidatorInterface* childDirect2 = this->findChild<BalVfpValidatorInterface*>(QString("customValidator"), Qt::FindDirectChildrenOnly);

代码:

设置表单.cpp

SettingsForm::SettingsForm(QWidget* pParent, const QString& name)
    : DialogForm(staticMetaObject.className(), pParent, name)
{
    setupUi(this);
}


SettingsForm::~SettingsForm (void)
{
}
void SettingsForm::formInitialized(void)
{

    RangeValidator rangeValidator = new RangeValidator(this);
    rangeValidator.setObjectName("customValidator");

    ValidatorInterface* childRecursive = this->findChild<ValidatorInterface*>("customValidator", Qt::FindChildrenRecursively);
    ValidatorInterface* childDirect = this->findChild<ValidatorInterface*>("customValidator", Qt::FindDirectChildrenOnly);

    QList<ValidatorInterface*> childrenRecursive = this->findChildren<ValidatorInterface*>("customValidator", Qt::FindChildrenRecursively);
    QList<ValidatorInterface*> childrenDirect = this->findChildren<ValidatorInterface*>("customValidator", Qt::FindDirectChildrenOnly);

    
    DialogForm::formInitialized();
}

ValidatorInterface.h

class CORE_EXPORT ValidatorInterface : public QObject
{
    Q_OBJECT

public:
    explicit ValidatorInterface(QObject* pParent) : QObject(pParent){};
    virtual ~ValidatorInterface() {};

public:
    /*!
     * @brief This function will give a default implementation for parameter support.
     * @details This function should be overridden if the validator needs dynamic properties from the parameter.
     * @param value The value to validate
     * @param pParameter The parameter to use dynamics from
     * @return If value is valid.
     */
    virtual bool validate(const QVariant& value, Parameter* pParameter) {
        return validate(value);
    }
    /*!
     * @brief Validates a value
     * @param value The value to validate
     * @return If it is valid.
     */
    virtual bool validate(const QVariant& value) = 0;

};

RangeValidator.cpp

#include "rangevalidator.h"
#include "validatorinterface.h"

RangeValidator::RangeValidator(QObject* pParent)
    : ValidatorInterface(pParent)
{
}


RangeValidator::~RangeValidator()
{
}

bool RangeValidator::validate(const QVariant& value) 
{
    if (!value.canConvert<double>())
    {
        return false;
    }

    double l_val = value.toDouble();

    return (l_val <= m_max) && (l_val >= m_min);
}
c++ qt qt5
1个回答
0
投票

我已经找到了。这是一个愚蠢的错误。 QT 完全没问题。不过,我在第 30 行设置了 ObjectName。这是关于堆栈上的对象。它们是不同的对象。使用指针和指针运算符 (->),我实际上调用了正确的对象。与形式相关的一个。现在该对象有了实际名称(默认为空字符串),并且可以使用

QString& name
参数找到。

© www.soinside.com 2019 - 2024. All rights reserved.