2012-09-18 54 views
3

我在簡單的Qt Quick中有這樣的代碼。我想從我的類中更改qml元素的屬性值。如何從Q ++類更改QML中的屬性值

myclass.h

#ifndef MYCLASS_H 
#define MYCLASS_H 
#include <QObject> 
#include "qdebug.h" 
#include <QtGui/QApplication> 
#include <QDebug> 
#include <QDeclarativeContext> 
#include <QGraphicsObject> 
#include <QVariant> 

class myClass : public QObject 
{ 
    Q_OBJECT 

public: 
    myClass(QObject *QMLObject) : m_QMLObject(QMLObject) {} 

public slots: 
    void cppSlot(int number); 

protected: 
    QObject *m_QMLObject; 

}; 

#endif // MYCLASS_H 

myclass.cpp

#include "myclass.h" 

void myClass::cppSlot(int number) { 
    qDebug() << "Called the C++ slot with" << number; 
    QObject* textinput = m_QMLObject->findChild<QObject*>("textinput"); 

    QObject* memo = m_QMLObject->findChild<QObject*>("memo"); 

    QString str; 

    str=(textinput->property("text")).toString(); 

    int a; 
    a=str.toInt(); 
    a++; 

    QString str2; 
    str2=QString::number(a); 

    memo->setProperty("text", str+"+1="+str2); 
} 

的main.cpp

#include <QtGui/QApplication> 
#include "qmlapplicationviewer.h" 
#include <QUrl> 
#include <QDebug> 
#include <QDeclarativeContext> 
#include <QGraphicsObject> 
#include "myclass.h" 

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 

    QmlApplicationViewer viewer; 

    myClass MyClass(viewer.rootObject()); 


    viewer.rootContext()->setContextProperty("myObject", &MyClass); 

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setSource(QUrl("qrc:qml/qml/Example/main.qml")); 


    viewer.showExpanded(); 

    return app->exec(); 
} 

main.qml

import QtQuick 1.0 

Rectangle { 
    width: 300 
    height: 300 
    anchors.fill: parent 


    Column { 
     spacing: 5 
     anchors.centerIn: parent; 

     Rectangle { 
      id: button 

      width: 100 
      height: 30 

      color: "#e0b87b" 

      Text { 
       id: buttonLabel 
       text: "Start" 
       anchors.centerIn: parent; 
      } 

      MouseArea { 
       anchors.fill: parent 
       id: mouseArea 

       onClicked: myObject.cppSlot(1); 
      } 
     } 

      Rectangle { 
       id: textinputRect 


       width: 100 
       height: 18 


       color: "#e0b87b" 

       TextInput { 
        id: textinput 
        objectName: "textinput" 
        color: "#f51515"; 
        selectionColor: "blue" 
        font.pixelSize: 12; 
        width: parent.width-4 
        anchors.centerIn: parent 
        focus: true 
        text:"1" 
        } 
      } 


      Rectangle { 
       id: memoRect 


       width: 100 
       height: 35 


       color: "#00b87b" 

       TextEdit{ 
        id: memo 
        objectName: "memo" 
        wrapMode: TextEdit.Wrap 
        width:parent.width; 
        readOnly:true 
       } 
      } 

    } 

} 

當我運行應用程序並單擊按鈕時,應用程序崩潰。我究竟做錯了什麼?

回答

2

的rootObject尚未實例化,嘗試這樣的事情:

Q_DECL_EXPORT int main(int argc, char *argv[]) 
{ 
    QScopedPointer<QApplication> app(createApplication(argc, argv)); 
    QmlApplicationViewer viewer; 
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); 
    viewer.setSource(QUrl("qrc:qml/qml/Example/main.qml")); 
    myClass MyClass(viewer.rootObject()); 
    viewer.rootContext()->setContextProperty("myObject", &MyClass); 
    viewer.showExpanded(); 
    return app->exec(); 
} 

這樣的rootObject()將指向正確的實例。

+0

非常感謝!有效! – Harrix

+5

如果有效,則將其標記爲接受的答案。 –

0

m_QMLObject爲NULL。在嘗試將rootObject()傳遞給「myClass」對象的構造函數之前,您需要從資源組件FIRST加載QML,否則它將始終爲NULL。