alt sınıfında QML'den Q_INVOKABLE alanı arayamıyorum veya QQmlPropertyMap
sınıfını sınamaya çalışıyorum. Eğer alt sınıfını yapabilirsem, istediğim şey için işe yarayabilir gibi görünüyor. here dokümantasyonu, alt sınıflandırma için ne yapılması gerektiği konusunda bile bazı temel talimatlar verir. Söz konusu belgeler ayrıca bu sınıfın QObject
'dan geldiğini de belirtir.QQmlPropertyMap
Bunun için QtQuick 2.0 ile Qt 5.0.0 üzerinde QtCreator 2.6.1 kullanıyorum.
Benim main.qml:
import QtQuick 2.0
Rectangle {
width: 360
height: 360
Text {
text: owner.field
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
owner.testFunc();
}
}
}
Benim main.cpp: Ben çalıştırdığınızda
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include "TestMap.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{
TestMap* map = new TestMap();
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
QQmlContext* ctxt = viewer.rootContext();
ctxt->setContextProperty("owner", map);
viewer.setMainQmlFile(QStringLiteral("qml/TestMap/main.qml"));
viewer.showExpanded();
return app.exec();
}
Benim TestMap.h
#ifndef TESTMAP_H
#define TESTMAP_H
#include <QObject>
#include <QQmlPropertyMap>
#include <QDebug>
class TestMap: public QQmlPropertyMap // QObject
{
Q_OBJECT
public:
TestMap(QObject* parent = 0): QQmlPropertyMap(this, parent) // QObject(parent)
{
insert("field", "value"); // Comment this out
}
TestMap(const TestMap& value) { }
virtual ~TestMap() {}
public slots:
void testFunc()
{
qDebug() << "Success!";
}
};
Q_DECLARE_METATYPE(TestMap)
#endif
, benim hemen bir pencere söyleyerek "değeri "beklediğim gibi. Pencerenin tıkladığında Ama ben benzer sorunlar için baktım
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
söyleyen bir konsol çıktısını almak, ancak tüm arama sonuçları Q_OBJECT
makro eklemeyi unutursam insanlar hakkındadır. Kodda yanlış yaptığım bir şey olmalı, çünkü TestMap dosyasının yorumlarında belirtilen tüm değişiklikleri yaparsam (ve main.cpp ve main.qml'yi olduğu gibi bırakın), qDebug
iletisini alıyorum bekliyoruz.
Q_DECLARE_METATYPE
ya da (2-arg korumalı yapıcının benim için yapması gerekiyor sanırım) yapmam gerekmediğinden emin değilim, ama her iki şekilde işe yaramıyor. Kayıt için
1) QObject
yerine QQmlPropertyMap
türevi.
2) için yapıcı değiştirin:
TestMap(QObject* parent = 0): QObject(parent) {}
Ve işte bu kadar. Main.cpp, main.qml veya slotun kendisi ile ilgili bir şey değiştirmediğimde işe yaradığı için, bunların yanlış bir şey olmadığı sonucuna varmalıyım. Bana yanlış yaptığımı söyleyen var mı?
, bu görünüşte Qt bir hata olduğunu. Burada gönderdiğim hata raporuna bakın: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152