[Qt-qml] QDeclarativePropertyMap: bug or mistake?
Sven Anderson
Sven.Anderson at snom.com
Tue Feb 14 14:49:40 CET 2012
Hi,
I'm using QDeclarativePropertyMap in my C++ extension, and I am
experiencing some binding proplems depending on the order of the items
in my QML file. The following test code produces a window with the text
"before.map.key1 = XXX, after.map.key4 = undefined", although the only
difference between the "before" and "after" item is their relative
position to the text item. Also any updates on the map work only on the
"before" item. I think this is a bug, but maybe I did a mistake, that I
don't see. (The problem is not, that the map property is a (QObject *)
instead of a (QDeclarativePropertyMap *), or that it is CONSTANT without
NOTIFY, I tried that already.)
Here is the code:
( alternatively here: http://pastebin.com/zZChEzBj )
#include <QtGui/QApplication>
#include <QtDeclarative>
#include <QDeclarativePropertyMap>
#include "qmlapplicationviewer.h"
class MyItem : public QObject {
Q_OBJECT
Q_PROPERTY(QStringList keys READ Keys WRITE SetKeys)
Q_PROPERTY(QObject *map READ Map CONSTANT)
public:
MyItem(QObject *parent = 0) : QObject(parent) {}
QStringList Keys() const { return map_.keys(); }
QDeclarativePropertyMap *Map() { return &map_; }
void SetKeys(const QStringList &keys) {
Q_FOREACH(QString key, keys) {
if (!map_.contains(key)) {
map_.insert(key, QVariant(QString("XXX")));
}
}
}
private:
QDeclarativePropertyMap map_;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QmlApplicationViewer viewer;
qmlRegisterType<MyItem>("Test", 1, 0, "MyItem");
viewer.setMainQmlFile(QLatin1String("qml/qmltest2/main.qml"));
viewer.showExpanded();
return app.exec();
}
#include "main.moc"
-------------------------------------------------------------------------------------------
import QtQuick 1.0
import Test 1.0
Rectangle {
width: 400
height: 200
MyItem {
id: before
keys: ["key1", "key2", "key3"]
Component.onCompleted: console.log("before item completed: " + keys)
}
Text {
text: "before.map.key1 = " + before.map.key1 + ", after.map.key4
= " + after.map.key4
anchors.centerIn: parent
}
MyItem {
id: after
keys: ["key4", "key5", "key6"]
Component.onCompleted: console.log("after item completed: " + keys)
}
}
More information about the Qt-qml
mailing list