设置可见(isVisible()); },c++,qt,qml,qquickitem,C++,Qt,Qml,Qquickitem" /> 设置可见(isVisible()); },c++,qt,qml,qquickitem,C++,Qt,Qml,Qquickitem" />

构造函数中的QQuickItem父项为null 我对通过C++ QQuiType访问QML父级的属性感兴趣。我有一个名为VisibleTag的定制QQuickItem扩展QQuickItem。任何包含此对象标记的qml项,我都希望根据我在代码中设置的其他因素将其设置为可见或不可见,这些因素是我为解决此问题而临时删除的。但是,我有一个问题,我的父指针在构造时为空 //main.cpp #include <QtQuick/QQuickView> #include <QGuiApplication> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<VisibleTag>("VisibleTag", 1, 0, "VisibleTag"); QQuickView view; view.setResizeMode(QQuickView::SizeRootObjectToView); view.setSource(QUrl("qrc:///app.qml")); view.show(); return app.exec(); } //cpp VisibleTag::VisibleTag(QQuickItem*父项) :QQuickItem(父项) { //qDebug()objectName();//由于父项为null,此行将中断 父->设置可见(isVisible()); }

构造函数中的QQuickItem父项为null 我对通过C++ QQuiType访问QML父级的属性感兴趣。我有一个名为VisibleTag的定制QQuickItem扩展QQuickItem。任何包含此对象标记的qml项,我都希望根据我在代码中设置的其他因素将其设置为可见或不可见,这些因素是我为解决此问题而临时删除的。但是,我有一个问题,我的父指针在构造时为空 //main.cpp #include <QtQuick/QQuickView> #include <QGuiApplication> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<VisibleTag>("VisibleTag", 1, 0, "VisibleTag"); QQuickView view; view.setResizeMode(QQuickView::SizeRootObjectToView); view.setSource(QUrl("qrc:///app.qml")); view.show(); return app.exec(); } //cpp VisibleTag::VisibleTag(QQuickItem*父项) :QQuickItem(父项) { //qDebug()objectName();//由于父项为null,此行将中断 父->设置可见(isVisible()); },c++,qt,qml,qquickitem,C++,Qt,Qml,Qquickitem,相反,我希望父指针指向qml的可视父项。在本例中,我希望父对象指向矩形opPic 我是否误解了QQuickItem构造函数的工作原理?是否可以访问qml可视父项?qml对QQuickItem的构造不是: T*o=新的T(父级); 但是 T*o=新的T; T->setParentItem(父项); 因此,您无法在构造函数中获取父级,但必须在方法中进行(类似于在QML中): \ifndef VISIBLETAG\u H #定义VISIBLETAG_H #包括 类VisibleTag:公共QQui

相反,我希望父指针指向qml的可视父项。在本例中,我希望父对象指向矩形opPic


我是否误解了QQuickItem构造函数的工作原理?是否可以访问qml可视父项?

qml对QQuickItem的构造不是:

T*o=新的T(父级);
但是

T*o=新的T;
T->setParentItem(父项);
因此,您无法在构造函数中获取父级,但必须在方法中进行(类似于在QML中):

\ifndef VISIBLETAG\u H
#定义VISIBLETAG_H
#包括
类VisibleTag:公共QQuickItem
{
Q_对象
公众:
VisibleTag(QQuickItem*parent=nullptr);
受保护的:
void componentComplete();
私人:
bool dummy(){return false;}
};
#endif//VISIBLETAG\u H
#包括“visibletag.h”
VisibleTag::VisibleTag(QQuickItem*父项):QQuickItem(父项)
{
}
void VisibleTag::componentComplete()
{
if(parentItem())
parentItem()->setVisible(dummy());
}

这个问题不太清楚。当
parent
是空指针时,您想做什么?@idclev463035818我将稍微更新问题的措辞,但我遇到的问题是我希望它不是空指针。我希望父对象设置为矩形opPic,因为它是VisibleTag的可视父对象。相反,构造函数接收空值,请发布一个。如何创建
可视标签
?是否将父级传递给构造函数?@idclev463035818 VisibleTag使用qmlRegisterType声明,矩形包含在从main加载的qml文件中。如果有帮助的话,我可以添加一个main来解释正在发生的事情,但是上面的例子应该是给我一个MREPlease注释,你不需要
QQuickItem
来做你想做的事情。如果您的
VisibleTag
类型没有任何可视外观,则可以从
QObject
派生它。
//app.aml
Rectangle{
    id: opPic
    height: 100
    width: 100
    color: "red"
    VisibleTag{}
}
//header
class VisibleTag : public QQuickItem
{
    Q_OBJECT
public:
    VisibleTag( QQuickItem* parent = nullptr );

private:
    bool isVisible() { return false; } //this is a dummy function for testing my issue
}
//cpp
VisibleTag::VisibleTag( QQuickItem* parent )
    : QQuickItem( parent )
{
    //qDebug() << parent->objectName(); //This line will break because parent is null
    parent->setVisible( isVisible() );
}