gpt4 book ai didi

c++ - Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:37 27 4
gpt4 key购买 nike

我正在做一些事情,我有一个名为“FloatingMenu”的类(它应该在 C++ 中管理菜单)及其在文件 FloatingMenu.qml 中用于 GUI 的 QML alter-ego。我有一个文件 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();
}

和:

#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;
}

我的主窗口.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
}



}

}

最后,FloatingMenu.qml:

import EasyGraph 1.0
import QtQuick 2.0

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

我不知道我做错了什么,我不明白它为什么不起作用。我唯一想做的就是将一个 QML 对象与一个类绑定(bind),并让 QML 成为绘图部分……我想我缺少了一个小选项或可以使它工作的东西。

提前致谢!

最佳答案

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

import EasyGraph 1.0 
import QtQuick 2.0
FloatingMenu {
Rectangle { width: 30; height: 30 color: "red" }
}

现在使用您的 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 }
}
}

关于c++ - Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23168475/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com