我在使用 Qt 对象树时遇到了一些问题。我有一个继承自
RangeValidator
的 ValidatorInterface
。我在堆上创建它并将父级与其耦合以进行内存管理。这位家长是SettingsForm
。
但是,即使新的
RangeValidator
直接耦合到表单(使用“this”),它似乎并没有将其视为直接子级。它只能递归地找到它。您可以在调试器的“本地”选项卡中看到这一点。
请注意,
RangeValidator
对象是SettingsForm
的直接子对象。我已在 QObject::children
下检查了调试器。
有人知道这是怎么回事吗?我似乎无法弄清楚这一点。
编辑: 看起来与
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);
}
我已经找到了。这是一个愚蠢的错误。 QT 完全没问题。不过,我在第 30 行设置了 ObjectName。这是关于堆栈上的对象。它们是不同的对象。使用指针和指针运算符 (->),我实际上调用了正确的对象。与形式相关的一个。现在该对象有了实际名称(默认为空字符串),并且可以使用
QString& name
参数找到。