Results 1 to 16 of 16

Thread: Catching Qt/C++ signal from QML custom Item/code - howto

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Jan 2006
    Location
    Ljubljana
    Posts
    687
    Thanks
    111
    Thanked 4 Times in 4 Posts
    Qt products
    Qt5 Qt/Embedded
    Platforms
    MacOS X Unix/X11 Windows Android

    Question Catching Qt/C++ signal from QML custom Item/code - howto

    I am working on QML app with Qt/C++ "back" logic. Now, I've created class named UeStatus, which resemble the state of app (which users are logged in, database connection succesfull or not, ...):
    Qt Code:
    1. #ifndef UESTATUS_H
    2. #define UESTATUS_H
    3.  
    4. #include <QObject>
    5. #include <QList>
    6.  
    7. #include "../core/uetypes.h"
    8. #include "../core/uedatabaseconnectionstatus.h"
    9.  
    10. class UeStatus : public QObject
    11. {
    12. Q_OBJECT
    13.  
    14. Q_PROPERTY(UeTypeLoggedUsers* m_ueLoginCandidates
    15. READ ueLoginCandidates
    16. WRITE ueSetLoginCandidates
    17. NOTIFY ueSignalLoginCandidatesChanged)
    18. Q_PROPERTY(UeTypeLoggedUsers* m_ueLoggedUsers
    19. READ ueLoggedUsers
    20. WRITE ueSetLoggedUsers
    21. NOTIFY ueSignalLoggedUsersChanged)
    22. Q_PROPERTY(UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus m_ueDatabaseConnectionStatus
    23. READ ueDbConnectionStatus
    24. WRITE ueSetDbConnectionStatus
    25. NOTIFY ueSignalDatabaseConnectionChanged)
    26.  
    27. private:
    28. UeTypeLoggedUsers* m_ueLoginCandidates;
    29. UeTypeLoggedUsers* m_ueLoggedUsers;
    30. UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus m_ueDatabaseConnectionStatus;
    31.  
    32. public:
    33. explicit UeStatus(QObject *parent = 0);
    34. ~UeStatus();
    35.  
    36. inline UeTypeLoggedUsers* ueLoginCandidates() const
    37. { return this->m_ueLoginCandidates; }
    38. inline UeTypeLoggedUsers* ueLoggedUsers() const
    39. { return this->m_ueLoggedUsers; }
    40. inline UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus ueDbConnectionStatus() const
    41. { return this->m_ueDatabaseConnectionStatus; }
    42.  
    43. inline void ueSetLoginCandidates(UeTypeLoggedUsers* const m_ueLoginCandidates)
    44. { this->m_ueLoginCandidates=m_ueLoginCandidates; }
    45. inline void ueSetLoggedUsers(UeTypeLoggedUsers* const loggedUsers)
    46. { this->m_ueLoggedUsers=loggedUsers; }
    47. inline void ueSetDbConnectionStatus(const UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus& status)
    48. { this->m_ueDatabaseConnectionStatus=status; }
    49.  
    50. signals:
    51. void ueSignalLoginCandidatesChanged();
    52. void ueSignalLoggedUsersChanged();
    53. void ueSignalDatabaseConnectionChanged(const UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus& newStatus);
    54.  
    55. public slots:
    56. void ueSlotDatabaseConnectionChanged(const UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus& newStatus);
    57. };
    58.  
    59. #endif // UESTATUS_H
    To copy to clipboard, switch view to plain text mode 
    As you can see, I've also created dedicated class/enum for describing database connection state:
    Qt Code:
    1. #ifndef UEDATABASECONNECTIONSTATUS
    2. #define UEDATABASECONNECTIONSTATUS
    3.  
    4. #include <QObject>
    5.  
    6. class UeDatabaseConnectionStatus : public QObject
    7. {
    8. Q_OBJECT
    9.  
    10. public:
    11. enum UeTypeDatabaseConnectionStatus
    12. {
    13. NOT_CONNECTED=false,
    14. CONNECTED=true
    15. };
    16.  
    17. Q_ENUM(UeTypeDatabaseConnectionStatus)
    18. };
    19.  
    20. #endif // UEDATABASECONNECTIONSTATUS
    To copy to clipboard, switch view to plain text mode 
    Now, I register class UeDatabaseConnectionStatus inside main.cpp:
    Qt Code:
    1. #include <QtQml>
    2. #include <QApplication>
    3. #include <QQmlApplicationEngine>
    4.  
    5. #include "database/uepeoplemodel.h"
    6. #include "core/uestatus.h"
    7. #include "core/uedatabaseconnectionstatus.h"
    8.  
    9. int main(int argc, char *argv[])
    10. {
    11. QApplication app(argc, argv);
    12. QQmlApplicationEngine engine;
    13.  
    14. UeStatus* ueApplicationStatus=new UeStatus(qApp);
    15. UePeopleModel* uePeopleModel=new UePeopleModel(qApp);
    16.  
    17. QObject::connect(uePeopleModel,
    18. SIGNAL(ueSignalDatabaseConnectionChanged(UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus)),
    19. ueApplicationStatus,
    20. SLOT(ueSlotDatabaseConnectionChanged(UeDatabaseConnectionStatus::UeTypeDatabaseConnectionStatus)));
    21.  
    22. uePeopleModel->ueConnectToDatabase();
    23.  
    24. engine.rootContext()->setContextProperty("uePeopleModel",
    25. uePeopleModel);
    26. engine.rootContext()->setContextProperty("ueApplicationStatus",
    27. ueApplicationStatus);
    28. engine.addImageProvider(QLatin1String("uePeopleModel"),
    29. uePeopleModel);
    30.  
    31. qmlRegisterUncreatableType<UeDatabaseConnectionStatus>("si.test",
    32. 1,
    33. 0,
    34. "UeTypeDatabaseConnectionStatus",
    35. "Database Connection Status");
    36.  
    37. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    38.  
    39. return app.exec();
    40. }
    To copy to clipboard, switch view to plain text mode 
    and the GUI (QML) is defined in main.qml:
    Qt Code:
    1. import QtQuick 2.4
    2. import QtQuick.Controls 1.3
    3. import QtQuick.Window 2.2
    4. import QtQuick.Dialogs 1.2
    5. import QtQuick.Layouts 1.0
    6. import QtQuick.Controls.Styles 1.4
    7.  
    8. import "gui/windows"
    9. import "gui/items"
    10.  
    11. import si.mikroelektronika 1.0
    12.  
    13. ApplicationWindow
    14. {
    15. id: ueWindowMain
    16.  
    17. signal ueSignalDatabaseConnectionChanged()
    18.  
    19. title: qsTr("uBlagajna Mobile Client ver 1.00")
    20.  
    21. width: Screen.desktopAvailableWidth
    22. height: Screen.desktopAvailableWidth
    23.  
    24. visible: true
    25.  
    26. opacity: 1.0
    27.  
    28. contentOrientation: Qt.LandscapeOrientation
    29.  
    30. color: "black"
    31.  
    32. UeKeypad
    33. {
    34. id: ueLoginKeypad
    35. } // ueLoginKeypad
    36.  
    37. statusBar:
    38. StatusBar
    39. {
    40. id: ueStatusBar
    41.  
    42. height: 96
    43.  
    44. clip: true
    45.  
    46. antialiasing: true
    47.  
    48.  
    49. style:
    50. StatusBarStyle
    51. {
    52. background:
    53. Rectangle
    54. {
    55. color: "black"
    56. } // Rectangle
    57.  
    58. panel:
    59. Rectangle
    60. {
    61. color: "grey"
    62. }
    63. } // StatusBarStyle
    64.  
    65. RowLayout
    66. {
    67. spacing: 8
    68.  
    69. UeStatusIndicator
    70. {
    71. id: ueStatusIndicatorDatabaseConnected
    72.  
    73. ueParamImageStatusOn: "qrc:///ueIcons/icons/ueDbConnectionOk.png"
    74. ueParamImageStatusOff: "qrc:///ueIcons/icons/ueDbConnectionError.png"
    75. } // ueStatusIndicatorDatabaseConnected
    76. } // RowLayout
    77. } // ueStatusBar
    78. } // ueWindowMain
    To copy to clipboard, switch view to plain text mode 
    UeStatusIndicator.qml is item that containts two images according to its state:
    Qt Code:
    1. import QtQuick 2.0
    2.  
    3. Item
    4. {
    5. id: ueStatusIndicator
    6.  
    7. property string ueParamImageStatusOn
    8. property string ueParamImageStatusOff
    9.  
    10. state: "ueStatusIndicatorDabaseNotConnected"
    11.  
    12. Image
    13. {
    14. id: ueStatusIndicatorCurrentImage
    15.  
    16. smooth: true
    17.  
    18. fillMode: Image.PreserveAspectFit
    19.  
    20. width: 96
    21. height: 96
    22.  
    23. sourceSize.width: 96
    24. sourceSize.height: 96
    25. } // Image
    26.  
    27. Connections
    28. {
    29. } // Connections
    30.  
    31. states:
    32. [
    33. State
    34. {
    35. name: "ueStatusIndicatorDabaseConnected"
    36.  
    37. PropertyChanges
    38. {
    39. target: ueStatusIndicatorCurrentImage
    40. source: ueParamImageStatusOn
    41. } // PropertyChanges
    42. }, // State
    43.  
    44. State
    45. {
    46. name: "ueStatusIndicatorDabaseNotConnected"
    47.  
    48. PropertyChanges
    49. {
    50. target: ueStatusIndicatorCurrentImage
    51. source: ueParamImageStatusOff
    52. } // PropertyChanges
    53. } // State
    54. ] // states
    55. } // Item
    To copy to clipboard, switch view to plain text mode 
    Now, how do I catch signal void ueSignalDatabaseConnectionChanged(const UeDatabaseConnectionStatus::UeTypeDatabaseConnecti onStatus& newStatus); or slot void ueSlotDatabaseConnectionChanged(const UeDatabaseConnectionStatus::UeTypeDatabaseConnecti onStatus& newStatus); inside ueStatusIndicator?
    Sincerely,
    Marko
    Last edited by MarkoSan; 17th September 2015 at 07:53. Reason: updated contents
    Qt 5.3 Opensource & Creator 3.1.2

Similar Threads

  1. Catching signal from Mobile Dialpad buttons
    By baluk in forum Qt Programming
    Replies: 1
    Last Post: 27th September 2010, 11:05
  2. Catching exceptions with Qt
    By The_Fallen in forum Qt Programming
    Replies: 6
    Last Post: 30th July 2010, 19:39
  3. Replies: 1
    Last Post: 30th July 2010, 07:23
  4. Qt - catching interrupts
    By rishid in forum Qt Programming
    Replies: 2
    Last Post: 5th February 2008, 14:17
  5. Catching X Events
    By nupul in forum Qt Programming
    Replies: 3
    Last Post: 16th April 2006, 12:43

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.