使用qt6的qml编写Serial Port

信号-槽、多线程、QML
  • Qt Environment
  • Qt Singleton
  • Qt Update Issue

Qt Environment

installer

default:

  • qt creator
    qt-online-creator
  • Build tools
    qt-online-cmake

MSVC

  • vs2019(qt5.15)
    qt5.15 msvc2019
  • vs2019
    qt6.5 msvc2019
  • vs2022
    qt6.8 msvc2022

Additional Libraries

  • Qt5

Included in the integration module

No need to select additional

  • Qt6
    Qt Serial Port

CMake in Qt Creator

程序设置:

-GNinja
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}

Deploy

  • v5.15
C:\Qt\5.15.2\msvc2019_64\bin\windeployqt --qmldir C:\Users\tdtc\Documents\SerialCom\SerialCom\QtRaspberry C:\Users\tdtc\Documents\SerialCom_qml\serialCom.exe
  • v6.5
C:\Qt\6.5.3\msvc2019_64\bin\windeployqt --qmldir C:\Users\tdtc\Documents\SerialCom\SerialCom\QtRaspberry C:\Users\tdtc\Documents\SerialCom_qml\serialCom.exe
  • v6.8
C:\Qt\6.8.2\msvc2022_64\bin\windeployqt --qmldir C:\Users\tdtc\Documents\SerialCom\SerialCom\QtRaspberry C:\Users\tdtc\Documents\SerialCom_qml\serialCom.exe

Qt Singleton

The version that fully supports singletons is v5.14+

template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, 
std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)

主要的改进是第5个参数! 之前,是实例不了带参的类的。
The main improvement is the fifth parameter! Previously, only classes with no parameters could be instantiated.

qmlRegisterSingletonType<TrafficLightClass>("org.raymii.RoadObjects", 1, 0, "TrafficLightSingleton",
                                     [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
        Q_UNUSED(engine)
        Q_UNUSED(scriptEngine)

        TrafficLightClass *trafficLightSingleton = new TrafficLightClass();
        return trafficLightSingleton;
    });
 TrafficLightClass trafficLightSingleton;
    qmlRegisterSingletonType<TrafficLightClass>("org.raymii.RoadObjects", 1, 0, "TrafficLightSingleton",
                                     [&](QQmlEngine *, QJSEngine *) -> QObject * {
        return &trafficLightSingleton;
    });

Qt Update Issue

Issues when upgrading to Qt6

assigned values

ASSERT: "i >= 0 && i < size()" in file qbytearray.h, line 544

The “outBuffer” variable of the Frame class and the “m_buffer” variable of the SerialWorker class are assigned values, and the “=” is changed to “append()”.

  • For example, in frame.cpp
    Use
 m_buffer.append(FRAME_START);

instead of

m_buffer[INDEX_START_OF_FRAME] = FRAME_START;

signal parameters

qt.qml.context: qrc:/main.qml:168:13 Parameter "on" is not declared. 
Injection of parameters into signal handlers is deprecated. Use JavaScript functions with formal parameters instead.
  • v6
            onSwitched: function(on)
            {
                if(on === true)
                    FrameProcessorSingleton.enableAdc(1);
                else
                    FrameProcessorSingleton.enableAdc(0);
            }

Ref