voila j'ai un projet que j'ai commencer depuis longtemps
une application sur Android et desktop (Windows,Linux) coder avec qt5
en Qml, javascript et C++
j'ai finie l'interface en qml et javascript (tester sur Android et Linux)
et la je viens de finir le moteur de l'appli en c++
tout marche très bien sauf que je ne sais pas comment relier l'interface qml avec le cœur de l'appli en c++ (ce qui est normalement facile a faire )
j'ai passer des heures sur la docu officiel + tuto sur le net et j'arrive toujours pas a le faire
quelqu'un peux m'aider a comprendre ?
Pour comprendre j'aimerais qu'on m'explique comment relier ça :
j'ai une interface Basic qml :
voila le code qml
import QtQuick 1.1
Rectangle {
width: 400
height: 200
Text {
id: resultats
x: 122
y: 44
width: 140
height: 18
text: qsTr("resultats")
font.pixelSize: 12
}
Rectangle {
id: boutton
x: 285
y: 137
width: 45
height: 40
color: "#ac0505"
MouseArea {
id: mouseArea1
anchors.rightMargin: 0
anchors.bottomMargin: 0
anchors.leftMargin: 0
anchors.topMargin: 0
anchors.fill: parent
}
}
TextInput {
id: inputA
x: 30
y: 147
width: 80
height: 20
text: qsTr("Text Input A")
font.pixelSize: 12
}
TextInput {
id: inputB
x: 160
y: 147
width: 80
height: 20
text: qsTr("Text Input B")
font.pixelSize: 12
}
}
j'aimerais relier cette interface a se code c++ :
#include"calcules.h"
void ClProces::lancerCalculs()
{
Resultats = A+B;
}
ClProces::~ClProces()
{
}
le header :
namespace Cl {
class ClProces;
}
class ClProces : public QObject
{
Q_OBJECT
public:
ClProces();
~ClProces();
private slots:
void lancerCalculs();
private:
QString Resultats;
int A;B;
};
En gros pour ce qui comprennent pas le code ( )
je veux que quand l'utilisateur mais un chiffre dans «input A » et « input B » et qu'il appuis sur le carre rouge « MousseArea1 » le qml appel la fonction « lancerCalculs » , envois les chiffres dans leur variables « A et B » , la fonction fait la sommes des deux et renvois le résultats et le qml l’affiche dans résultats
i need you'r help
Hello,
Dans l'idéal,le lien entre QML et C++ est réalisé à l'aide de la fonction qmlRegisterType
Deux tutos (en anglais) mais ce sont les plus complets que j'ai trouvé :
http://www.ics.com/blog/integrating-c-qml
http://www.ics.com/blog/multilayered-architecture-qt-quick
Le 2ème n'utilise pas d'appel à qmlRegisterType mais c'est à mon avis une mauvaise solution si on veut vraiment séparer GUI (QML) et logique (C++) du soft.
ok merci je vais tester, , je poste le résultat si je réussis
bon j'ai pas reussi
j'ai codé ça (Qt5.3):
pro :
SOURCES += \
main.cpp maclass.cpp
QT+= widgets quickwidgets quick
HEADERS += \
maclass.h
OTHER_FILES += \
qmlTest.qml
Header :
class maclass : public QObject
{
Q_OBJECT
public:
explicit maclass(QObject *parent = 0);
signals:
public slots:
void mafonction();
};
Main :
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQuickView view;
view.setSource(QUrl::fromLocalFile("qmlTest.qml"))
;
view.show();
QObject *object = view.rootObject();
return app.exec();
}
Qml :
import QtQuick 2.2
Rectangle {
signal monSignal;
id: font
width: 360
height: 360
color: "#c957e5"
MouseArea {
anchors.fill: parent
onClicked: {
monSignal();
}
}
Text {
id: monTexte
anchors.centerIn: parent
text: "salut toi"
font.italic: true
font.bold: true
font.pointSize: 17
}
}
Sources :
maclass::maclass(QObject *parent) :
QObject(parent)
{
QObject::connect(Object, SIGNAL(monSignal()),this, SLOT(mafonction()));
}
void maclass::mafonction()
{
}
j'ai une erreur sur :
maclass::maclass(QObject *parent) :
QObject(parent)
{
QObject::connect(Object, SIGNAL(monSignal()),this, SLOT(mafonction()));
}
erreur : 'Object' was not declared in this scope
j'ai compris l'erreur mais je ne sais pas comment la corrigé
personnes sais comment en appel une fonction c++ a partir d'un qml sur qt5 ?
j'aimerais juste qu'on m'explique avec un code simple et commentées
je trouve plusieurs versions complètement différentes a chaque fois que je fais une recherche,
se que j'ai compris c'est qu'il faut lire en permanence le rootObject du view avec un dynamique cast et le connecter a ma fonction avec un QObject::connect(rootObject , signal (monSignal ()), maclass, slot (monSlot ());
mais jusqu'à maintenant j'ai pas réussi a le faire
j'ai fini par trouver la bonne methode
http://developer.nokia.com/community/wiki/Connecting_Qt_signal_to_QML_function
c'est un tuto pour Qt4 mais il suffit de changer les noms des class maitre leur équivalent Qt5 et ça marche nikel