Send text from Qt to QML
-
Hi,
I have no idea what might be wrong :/
I am beginneer in Qt and QML. firstly I exchange data beetwen QML and Qt by Q_PROPERTY macro.Now I create next class to exchange data, and finnaly I have three registered object to exchange data like below:
main.cppqmlRegisterType< PrinterSystemController >("MyPrinterController",1,0,"PrinterSystemController"); qmlRegisterType< RfidSystemController >("MyRfidController",1,0,"RfidSystemController"); qmlRegisterType< NetworkSystemController >("MyNetworkController",1,0,"NetworkSystemController");mian.qml
PrinterSystemController { id: printerSystemController } RfidSystemController { id: rfidSystemController } NetworkSystemController { id: networkSystemController }In PrinterSystemController and RfidSystemController everythings works. But in networSystemController works only Q_INVOKABLE metods calls form QML. When I try do some Q_PROPERTY :
Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)Next I set some QStirng value by:
setUserName(userNameInput);and read this property in qml to text:
Text { text: networkSystemController.rfidnumber anchors.horizontalCenter: rectContuserTest.horizontalCenter anchors.verticalCenter: rectContuserTest.verticalCenter font.pixelSize: rectContuserTest.width * .15 color: "white" }it doesn't work, without any warnings and erros.... what should I check ?
-
@JoeCFD
Yes, probably I found problem. QML create own object , and I created second object in Qt, so I worked from two different objects.I explain you .
I have two class :
NetworkSystemController
NetworkProcessor
The first class is to "data container" for QML visualisation, and them object is created by register this class in QML and import to QML.NetworkSystemController { id: networkSystemController }From my second class (
NetworkProcessor) I would like to senduserDetailsvariable , so I created object:NetworkSystemController * networkSystemController = new NetworkSystemController; connect(this, &NetworkProcessor::userDetails, networkSystemController, &NetworkSystemController::userDetails);and slot in
NetworkSystemControllervoid NetworkSystemController::userDetails(QString userName) { setUserName(userName); }and
setUserNamemetod :void NetworkSystemController::setUserName(const QString &newUserName) { if (m_userName == newUserName) return; m_userName = newUserName; emit userNameChanged(); qDebug()<<"!!!here we are !!!"; }is always called, but
emitsignal not emitted to object created by QML, am I right ? I would be really gratefull if someone give me a tips how to realize my concept without creatingNetworkSystemControllerobject outsied QML ? -
No, it is not a problem, when I did like below , the text appear on screen:
Text { text: "Text test" ///networkSystemController.userName anchors.horizontalCenter: rectContuserName.horizontalCenter anchors.verticalCenter: rectContuserName.verticalCenter font.pixelSize: rectContuserName.width * .15 color: "white" } -
copy and paste error?
Text { text: networkSystemController.userName anchors.horizontalCenter: rectContuserTest.horizontalCenter anchors.verticalCenter: rectContuserTest.verticalCenter font.pixelSize: rectContuserTest.width * .15 color: "white" }@JoeCFD I noiced that now my qtCreator in other way (propapbly after update) do
Generate Missing Q_PROPERTY MembersCurrently result :

and before update it look like this:

I try rewrite my new Q_PROPERTY like old construction but still my NetworSystemController can't send QString to QML page. :/
Any idea?
-
@JoeCFD I noiced that now my qtCreator in other way (propapbly after update) do
Generate Missing Q_PROPERTY MembersCurrently result :

and before update it look like this:

I try rewrite my new Q_PROPERTY like old construction but still my NetworSystemController can't send QString to QML page. :/
Any idea?
@Damian7546 "emit userNameChanged();" will update it.
-
@Damian7546 "emit userNameChanged();" will update it.
@JoeCFD I do that from beginning.
void NetworkSystemController::setUserName(const QString &newUserName) { if (m_userName == newUserName) return; m_userName = newUserName; emit userNameChanged(); qDebug()<<"!!!here we are !!!"; }And in console I got message "!!!here we are !!!", and nothing in QML , so?
-
@JoeCFD I do that from beginning.
void NetworkSystemController::setUserName(const QString &newUserName) { if (m_userName == newUserName) return; m_userName = newUserName; emit userNameChanged(); qDebug()<<"!!!here we are !!!"; }And in console I got message "!!!here we are !!!", and nothing in QML , so?
@Damian7546 did you define the signal userNameChanged() in NetworkSystemController?
-
@Damian7546 did you define the signal userNameChanged() in NetworkSystemController?
@JoeCFD Exactly:
signals: void userNameChanged(); -
copy and paste error?
Text { text: networkSystemController.userName anchors.horizontalCenter: rectContuserTest.horizontalCenter anchors.verticalCenter: rectContuserTest.verticalCenter font.pixelSize: rectContuserTest.width * .15 color: "white" } -
@JoeCFD add this in front of your Text to see what happens.
Connections { target: networkSystemController function onUserNameChanged() { console.log( "===========") } }@JoeCFD nothing....without logs after emit userNameChanged();
Connections { target: networkSystemController function onUserNameChanged() { console.log("===========") } } Text { text: networkSystemController.userName anchors.horizontalCenter: rectContuserName.horizontalCenter anchors.verticalCenter: rectContuserName.verticalCenter font.pixelSize: rectContuserName.width * .15 color: "white" }What more can I check ?
-
I'm still struggling with mine problem, now I try called two functions like below:
void NetworkSystemController::companyDetails(QString userNamein) { setUserName(userNamein); } void NetworkSystemController::testFun() { setUserName("testowyName"); }and
setUserNamedefinition:void NetworkSystemController::setUserName(const QString &newUserName) { if (m_userName == newUserName) return; m_userName = newUserName; emit userNameChanged(); qDebug()<<"!!!here we are !!!"; }In both calling I get message "!!!here we are !!!" in console, but in QML signal works only by
testFun()but doesn't work when calledcompanyDetails(QString userNamein)Any idea?
-
@Damian7546 said in Send text from Qt to QML:
void NetworkSystemController::companyDetails(QString userNamein)
{
setUserName(userNamein);
}change it here. You see the mismatch: QString userNamein and const QString &newUserName
void NetworkSystemController::companyDetails( const QString & userNamein)
{
setUserName(userNamein);
} -
@Damian7546 said in Send text from Qt to QML:
void NetworkSystemController::companyDetails(QString userNamein)
{
setUserName(userNamein);
}change it here. You see the mismatch: QString userNamein and const QString &newUserName
void NetworkSystemController::companyDetails( const QString & userNamein)
{
setUserName(userNamein);
}@JoeCFD said in Send text from Qt to QML:
@Damian7546 said in Send text from Qt to QML:
void NetworkSystemController::companyDetails(QString userNamein)
{
setUserName(userNamein);
}change it here. You see the mismatch: QString userNamein and const QString &newUserName
void NetworkSystemController::companyDetails( const QString & userNamein)
{
setUserName(userNamein);
}It isn't problem. I tested function like:
void NetworkSystemController::testFun(QString name) { setUserName(QString); }and works. but my still doesn't work :/
void NetworkSystemController::companyDetails(QString userNamein) { setUserName(userNamein); }This two functions are only different call. First(good working) is called by button from visualisation, but
companyDetailsby emit signal from other object. ... And both functions are performed, but only first functionemit signalworks properly with qml ... -
@JoeCFD said in Send text from Qt to QML:
@Damian7546 said in Send text from Qt to QML:
void NetworkSystemController::companyDetails(QString userNamein)
{
setUserName(userNamein);
}change it here. You see the mismatch: QString userNamein and const QString &newUserName
void NetworkSystemController::companyDetails( const QString & userNamein)
{
setUserName(userNamein);
}It isn't problem. I tested function like:
void NetworkSystemController::testFun(QString name) { setUserName(QString); }and works. but my still doesn't work :/
void NetworkSystemController::companyDetails(QString userNamein) { setUserName(userNamein); }This two functions are only different call. First(good working) is called by button from visualisation, but
companyDetailsby emit signal from other object. ... And both functions are performed, but only first functionemit signalworks properly with qml ...@Damian7546 qDebug()<<"!!!here we are !!!"; shows up in companyDetails() call?
-
@JoeCFD
Yes, probably I found problem. QML create own object , and I created second object in Qt, so I worked from two different objects.I explain you .
I have two class :
NetworkSystemController
NetworkProcessor
The first class is to "data container" for QML visualisation, and them object is created by register this class in QML and import to QML.NetworkSystemController { id: networkSystemController }From my second class (
NetworkProcessor) I would like to senduserDetailsvariable , so I created object:NetworkSystemController * networkSystemController = new NetworkSystemController; connect(this, &NetworkProcessor::userDetails, networkSystemController, &NetworkSystemController::userDetails);and slot in
NetworkSystemControllervoid NetworkSystemController::userDetails(QString userName) { setUserName(userName); }and
setUserNamemetod :void NetworkSystemController::setUserName(const QString &newUserName) { if (m_userName == newUserName) return; m_userName = newUserName; emit userNameChanged(); qDebug()<<"!!!here we are !!!"; }is always called, but
emitsignal not emitted to object created by QML, am I right ? I would be really gratefull if someone give me a tips how to realize my concept without creatingNetworkSystemControllerobject outsied QML ?