2013-01-09 66 views
4

我不知道如何將參數從QML文件傳遞到Qt中的C++文件。從qml到C++傳遞參數

QML代碼:

import QtQuick 1.1 

Rectangle{ 
    id:loin 
    height: 272 
    width:480 
    property alias loguid:loginuid 
    signal sigHome() 
    Rectangle{ 
     id:rect1 
     width:parent.width-80 
     height:24 
     TextInput { 
      id:loginuid 
      maximumLength: 16 
      width: maximumLength * 20 
      focus: false 
      validator: RegExpValidator { regExp: /\d+/ } 
      KeyNavigation.down: login1 
     } 
    } 
    Button{ 
     id: login1 
     x: 195 
     y: 187 
     height:30; 
     focus:false 
     border.color:"black" 
     opacity: activeFocus ? 1.0 : 0.5 
     Text{ 
     text:"LOGIN" 
      anchors.horizontalCenter:login1.horizontalCenter; 
      anchors.verticalCenter:login1.verticalCenter; 
     } 
     Keys.onReturnPressed: { 
      if(loginuid.text < 1000000000000000) 
      { 
       text1.opacity=0.1 
       error1.visible=true 
       errorText.text="\n enter valid 16 digit number\n" 
       errorOk.focus=true 
       loginuid.focus=false 
      } 
      else{ 
       loginuid.focus=false 
       loin.sigHome() 
      } 
     } 
    } 
} 

C++代碼:

#include <QApplication> 
#include <QDeclarativeView> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    int uid; 
    QDeclarativeView view; 
    view.setSource(QUrl::fromLocalFile("main.qml")); 
    view.show(); 
    return app.exec(); 
} 

當我按下登錄按鈕rect1.text內容shud去的main.cpp文件和uid在main.cpp中得到DAT值。像這樣uid=rect1.text
如何做到這一點?

回答

4

謝謝你,sebasgo,你的迴應幫了我。我使用信號和插槽進行通信。 我在main.qml中創建了一個信號。

signal info(string msg) 

和在登錄頁面

else{ 
    info(loginUid.text) 
    loginuid.focus=false 
    loin.sigHome() 
} 

和在main.cpp中我它連接到d槽 main.cpp中是這樣

#include <QtGui> 
#include <QApplication> 
#include <QDeclarativeView> 
#include <QtDeclarative> 

class DeclarativeView : public QDeclarativeView 
{ 
    Q_OBJECT 
    public: 
     DeclarativeView(const QUrl & source) : QDeclarativeView(source) 
     { 
     } 
    public slots: 
     void readText(QString quid) 
     { 
      qdebug<<quid; 
     }   
}; 
#include "main.moc" 
int main(int argc, char *argv[]) 
{ 
    QString file = "main.qml"; 

    QApplication app(argc, argv); 
    DeclarativeView view(QUrl::fromLocalFile(file)); 
    QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(view.rootObject()); 
    QObject::connect(item, SIGNAL(info(QString)), &view, SLOT(readText(QString))); 
    view.show(); 
    return app.exec(); 
} 
3

我不會嘗試從C++端聽取QML信號。調用C++方法與參數更容易,實現相同的:

要做到這一點,你必須:

  • 定義slotinvokable方法接受必需的參數
  • register類攜帶的方法與聲明引擎
  • 那麼你可以set這個類的一個實例作爲你的root context的一個屬性,最後從QML調用這個方法

此主題在official documentation中也有很好的介紹。

1

創建GUI控制器C++類:

class UiController : public QObject 
{ 
    Q_OBJECT 

public: 
    UiController(); 
    virtual ~UiController(); 

public slots: 
    void cal_daysoff__onDoubleClicked(const QDate& date); 
}; 

在QML文件定義,比方說,一個日曆控制在其中一個信號連接到所述控制器的槽:

Calendar{ 
    id: cal_daysoff 
    Layout.fillWidth: true 
    Layout.fillHeight: true 
    onDoubleClicked: UiController.cal_daysoff__onDoubleClicked(date) 
} 

在主文件中,啓動QML接口時,連接接口到控制器:

#include "uicontroller.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QQmlApplicationEngine engine; 

    UiController control; 
    engine.rootContext()->setContextProperty("UiController", &control); 

    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
}