[Qt-qml] Custom data type in slot parameter
michael.brasser at nokia.com
michael.brasser at nokia.com
Mon Oct 25 08:44:07 CEST 2010
Hi Robert,
On 22/10/2010, at 4:06 PM, ext Robert Voinea wrote:
> I have a QtDeclarative application and I want to connect a signal in my C++
> code to a QML slot.
>
> The problem is that the signal in the C++ code has a custom data type
> (ButtonInformation).
> I have registered the custom data type with qRegisterMetaType,
> Q_DECLARE_METATYPE (so that it can be used with signals/slots) and with
> qmlRegisterType.
>
> If I set the parameter's type to QVariant, the slot gets called but I cannot
> see any properties of the parameter.
Functions added to an object in QML will have parameters of type QVariant, so this is the correct "connect".
> If I set the parameter's type to ButtonInformation then connect says there is
> no such slot...
>
> Any hits on how to achieve this?
I think you are probably running into http://bugreports.qt.nokia.com/browse/QTBUG-13047, which should be fixed for 4.7.1 (commit 1bd2eb8ecd6b2377132beaa789c8b3b8a6f544d9). In the meantime, changing
v.setValue(b);
to
v.setValue(qobject_cast<QObject*>(b));
might get things working (though I haven't tested to confirm).
Regards,
Michael
> Code follows:
>
> /** Button Information */
> class ButtonInformation;
> Q_DECLARE_METATYPE(ButtonInformation);
>
> class ButtonInformation : public QObject
> {
> Q_OBJECT
> public:
> ButtonInformation(QObject* parent = 0);
> ButtonInformation(const ButtonInformation& b);
> virtual ~ButtonInformation();
>
> Q_PROPERTY(QString text READ text WRITE setText);
> QString text() const;
> void setText(const QString& s);
> private:
> QString m_text;
> };
>
> /** MainView.h */
> class MainView : public QDeclarativeView
> {
> Q_OBJECT
> public:
> explicit MainView(QWidget* parent = 0);
> virtual ~MainView();
> void doSomething();
> signals:
> // void buttonAdd(ButtonInformation b);
> void buttonAdd(QVariant b);
> };
>
> /** MainView.cpp */
> void MainView::doSomething()
> {
> ButtonInformation b;
> b.setText("The Text");
> // emit buttonAdd(v);
>
> QVariant v;
> v.setValue(b);
> emit buttonAdd(v);
> }
>
> MainView::MainView(QWidget* parent) : QDeclarativeView(parent)
> {
> setSource("main.qml");
>
> QObject* obj = rootObject();
> if (!obj)
> ::exit(1);
>
> // connect(this, SIGNAL(buttonAdd(ButtonInformation)), obj,
> // SLOT(buttonAdd(ButtonInformation)));
> connect(this, SIGNAL(buttonAdd(QVariant)), obj,
> SLOT(buttonAdd(QVariant)));
> show();
> }
>
> /** main.cpp */
> int main(int argc, char** argv)
> {
> QApplication app(argc, argv);
>
> qmlRegisterType<ButtonInformation>("btn", 1, 0, "ButtonInformation");
> qRegisterMetaType<ButtonInformation>("ButtonInformation");
>
> MainView view;
> view.show();
> return app.exec();
> }
>
> /** main.qml */
> import Qt 4.7
> import btn 1.0
> Rectangle
> {
> id: main;
> property alias text: txt.text;
>
> Text
> {
> id: txt;
> text: "Default text";
> }
> function buttonAdd(ButtonInformation b)
> {
> main.text = b.text;
> }
> }
> --
> Robert Voinea
> IT Specialist
> +4 0740 467 262
> rvoinea (at) gmail [dot] com
> _______________________________________________
> Qt-qml mailing list
> Qt-qml at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-qml
More information about the Qt-qml
mailing list