首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt/QML -在C++中注册QML类型使QML代码无法工作

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

Stack Overflow用户
提问于 2014-04-19 09:47:09
回答 2查看 2.9K关注 0票数 4

我正在处理一个名为"FloatingMenu“的类(该类用于管理C++中的菜单)及其在FloatingMenu.qml文件中的GUI的QML自我。我有一个文件main.qml,其中有几个矩形和一个FloatingMenu,它如预期的那样显示。现在,如果我执行qmlRegisterType("EasyGraph",1,0," FloatingMenu ");在EasyGraph中,FloatingMenu突出的图形部分消失了。

这是我的代码:

代码语言:javascript
复制
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();
}

以及:

代码语言:javascript
复制
#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;
}

我的MainWindow.qml:

代码语言:javascript
复制
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
  }



 }

}

最后,FloatingMenu.qml:

代码语言:javascript
复制
import EasyGraph 1.0
import QtQuick 2.0

Rectangle {
 width: 30; height: 30
 color: "red"
}

我不知道我做错了什么,我不知道它怎么不起作用。我唯一想做的就是用类绑定一个QML对象,并让QML成为绘图部分.我想我错过了一个小小的选择或者什么能让它发挥作用的东西。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-19 10:41:42

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

代码语言:javascript
复制
import EasyGraph 1.0 
import QtQuick 2.0 
FloatingMenu {
    Rectangle { width: 30; height: 30 color: "red" }
}

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

代码语言:javascript
复制
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 } 
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-09-12 14:33:14

您有FloatingMenu C++组件和FolatingMenu.qml,它也是一个组件。因此,当您在导入FloatingMenu 1.0的qml文件中写入EasyGraph {}时,将找到并使用该c++ qml组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23168475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档