Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码无法工作

dde*_*mez 5 c++ qt qml qtquick2

我正在开发一个名为“FloatingMenu”的类(应该用 C++ 管理菜单),并且在文件 FloatingMenu.qml 中为 GUI 提供了 QML 版本。我有一个文件 main.qml,其中有几个矩形和一个 FloatingMenu,它按预期显示。现在,如果我执行 qmlRegisterType("EasyGraph", 1,0, "FloatingMenu"); 在我的 main.cpp 中,FloatingMenu 的图形部分消失了。

这是我的代码:

int main(int argc, char* argv[]){

 QGuiApplication app(argc, argv);

 //Register all the needed types in QML.
 qmlRegisterType<FloatingMenu>("EasyGraph", 1,0, "FloatingMenu");


 //The only window known as QDeCView in QML.
 QQuickView* view = new QQuickView();
 view->setMinimumHeight(100);
 view->setMinimumWidth(100);
 view->setResizeMode(QQuickView::SizeRootObjectToView);

 //Context, to set properties from c++ to QML
 //QQmlContext* cxt =  view->rootContext();

 //Load the base.
 view->setSource(QUrl::fromLocalFile("../qml/MainWindow.qml"&#41;&#41;;
 view->show();

 //FloatingMenu* menu = view->rootObject()->findChild<FloatingMenu*>("mainMenu"); //When registered, this works

 return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

和:

#ifndef _FLOATINGMENU_H_
#define _FLOATINGMENU_H_

#include <QQuickItem>
#include "GraphicalNode.hpp"


class FloatingMenu : public QQuickItem {
 Q_OBJECT
 Q_PROPERTY(GraphicalNode* target READ target WRITE setTarget NOTIFY onTargetNodeChanged)
private:
 GraphicalNode* _target;
public:
 FloatingMenu(QQuickItem* p = NULL);
 GraphicalNode* target() const;
 void setTarget(GraphicalNode* n);

signals:
 void onTargetNodeChanged(GraphicalNode*);
};


#endif

#include "FloatingMenu.hpp"

FloatingMenu::FloatingMenu(QQuickItem* p) : QQuickItem(p), _target(NULL){
 setFlag(QQuickItem::ItemHasContents, false); //I tried true and false here. what should it be? It has content, but I don't want to draw it from the C++ side.
}


GraphicalNode* FloatingMenu::target() const {
 return _target;
}

void FloatingMenu::setTarget(GraphicalNode* n) {
 _target = n;
}
Run Code Online (Sandbox Code Playgroud)

我的 MainWindow.qml:

import EasyGraph 1.0
import QtQuick 2.0



Rectangle {
 width: 400; height: 400
 color: "#333333"

 Flickable {
  id: flickable
  anchors.fill: parent
  width: 400; height: 400

  FloatingMenu{
   objectName: "mainMenu"
   id: menu
  }



 }

}
Run Code Online (Sandbox Code Playgroud)

最后是 FloatingMenu.qml:

import EasyGraph 1.0
import QtQuick 2.0

Rectangle {
 width: 30; height: 30
 color: "red"
}
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,我不明白它是如何不起作用的。我唯一想做的就是将 QML 对象与类绑定,并让 QML 成为绘图部分......我想我缺少一些选项或使其工作的东西。

提前致谢!

Arp*_*ius 3

当您导入模块时,EasyGraph您会隐藏文件 FloatingMenu.qml。将其更改为 SomeFloatingMenu.qml 并使用您的 FloatingMenu 项目:

import EasyGraph 1.0 
import QtQuick 2.0 
FloatingMenu {
    Rectangle { width: 30; height: 30 color: "red" }
}
Run Code Online (Sandbox Code Playgroud)

现在使用您的SomeFloatingMenu,它是您在 qml 组件中创建的 C++ 类:

import QtQuick 2.0 
Rectangle { 
    width: 400; height: 400; color: "#333333" 
    Flickable { 
        id: flickable; anchors.fill: parent; width: 400; height: 400; 
        SomeFloatingMenu { objectName: "mainMenu"; id: menu } 
    }
}
Run Code Online (Sandbox Code Playgroud)