2015-09-24 4 views
1

Bonjour j'ai un problème avec le signal de connexion QML avec Qt fente lorsque j'utilise QQuickView voici mon main.cpp:QML signaler sous QT avec QQuickView

ModelValueReceivers *mvr; 
mvr = new ModelValueReceivers(); 
QQuickView view; 
view.setSource(QUrl(("qrc:///Main.qml"))); 
QQuickView loginScreenView; 
loginScreenView.setSource(QUrl(("qrc:///LoginScreen.qml"))); 
QObject *loginScreen = loginScreenView.rootObject(); 
QObject::connect(loginScreen, SIGNAL(qmlSignal(QString, int)), mvr->valuesReceivers[U1], SLOT(start(QString, int))); 
view.show() 

Dans ModelValueReceivers est sous slots publics: void start(QString ipAddress, int tcpPort);

En LoginScreen.qml je signal: signal qmlSignal(string addressIP, int portTCP)

et émets est onClicked

onClicked: { 
      console.log("onClicked"); 
      qmlSignal(ipTextField.text , parseInt(tcpPortTextField.text)) 
     } 

Dans la console, je peux voir le journal "onClicked" mais la fente ne démarre pas.

dans Main.qml J'ai:

Rectangle { 
id: screen; width: 320; height: 480; 
color: "#ffffff" 
StackView{ 
    id: sv 
    property StackView sv: sv 
    initialItem: Qt.resolvedUrl("qrc:///LoginScreen.qml"); 
} }` 
+0

Ok pour simplier exemple que je donne ceci: 'QObject :: connect (loginScreen, SIGNAL (exitApp()), et ctrl, SLOT (on_closeAppButton_clicked()));' J'ai fente int ctrl et le même signal dans le fichier qml – Szymson

+0

Oh, je l'ai. Que l'échantillon n'est pas suffisant. Nous ne savons pas quel genre de récepteur est-ce. Et pas question! – AlexanderVX

+0

J'ai principal.qml où InitialItem est LoginScreen dans LoginScreen j'ai un bouton Login qui devrait être connecté à slot dans la classe Qt, mais je ne sais pas comment dans le fichier main.cpp se connecter connecter LoginScreen avec slot Qt classe. – Szymson

Répondre

0

Ok Je l'ai déjà fait avec TabView et chaque vue/fichier inséré dans un onglet séparé, alors maintenant j'ai accès à tous les onglets de Main. Il est l'exemple: TabView

Insérer fichier à l'onglet: component: Qt.createComponent("qrc:///LoginScreen.qml")

Dans main.cpp ajouter: QQmlContext* ctx = view.rootContext(); ctx->setContextProperty("controller", &ctrl); et dans tous les fichiers QML je peux connecter le signal QML à sous Qt et Qt Signal QML Emplacement:

Connections{ 
target: controller 
onSendValue:{ 
    u1TextField.text=String(value) 

    } 
} 



onClicked: { 
      console.log("Button Clicked") 
      controller.on_closeAppButton_clicked() 
     } 
1

À moins LoginScreen.qml est un singleton, je pense, vous utilisez 2 objets différents de LoginScreen.qml, un dans main.cpp et d'autres dans votre Main.qml.


Mise à jour:

Peut être, vous pouvez le faire:

Main.qml

... 
signal signalFromLogin(string, int); 

property Component loginScreen : LoginScreen { 
    onQmlSignal: signalFromLogin(addressIP, portTCP); 
} 
StackView{ 
    id: sv 
    property StackView sv: sv 
    initialItem: loginScreen; 
} 

maintenant, dans votre main.cpp

QQuickView view; 
view.setSource(QUrl(("qrc:///Main.qml"))); 
QObject* mainScreen = view.rootObject(); 
QObject::connect(maininScreen, SIGNAL(signalFromLogin(QString, int)), mvr->valuesReceivers[U1], SLOT(start(QString, int))); 

s'il vous plaît noter, je n'ai pas testé ce code.

+0

Comment puis-je connecter le signal de LoginScreen qui est à l'intérieur Main.qml – Szymson

+0

@Szymson vérifier ma mise à jour. Ce n'est pas garanti de travailler. Toujours pas sûr de ce 'mvr-> valuesReceivers [U1]'. – ramtheconqueror

+0

Intérieur mvr J'ai carte ValuesReceivers [enum] qui contient QTcpSocket et le début de logement (QString, int). Cela fonctionne dans mon application Qt avec MainWindow.cpp. Maintenant, j'ai besoin de faire qml GUI. – Szymson