由基于qml,c++的串口调试工具浅谈qml与c++混合编程

      最近在做一个基于sim900 的串口通信工具,基于qml和c++来实现。

      首先,对于串口,qt有自带的QSerialPort,可以实现同步,和异步通信,qt creator也有自带的例子,本例子是从其中一个名为“terminal”的例子学习了qt如何实现异步通信(c++),然后通过qml来写界面,逻辑部分由c++实现。

    通过qmlc++混合编程基于QSerialPort的异步通信(记得在pro中加上QT+=serialport),主要步骤包括下面几个:

1.使用setPort()或者setPortName()方指定想要访问的串口设备。

2.以只读或者只写或者读写模式调用open()方法打开串口。(注意:串口都是以互斥的方式访问,这也就是说我们不能打开一个已经打开的串口。)

3.成功打开之后,QSerialPort尝试着获取串口当前的配置并初始化它。你也可以使用setBaudRate(),setDataBits(),setParity(),setStopBits()和setFlowControl()方法重新配置它,

4.如果串口用读写模式打开,你就可以调用read()或者write()方法,可选的还有readline()和readAll()方法。可以使用close()方法来关闭串口和取消I/O操作。

下边叙述本程序: serial.h,serial.cpp为主函数,main.qml为主界面,Settings.qml为串口设置界面:

/main.qml///
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
Rectangle{
    width: 800
    height: 600
    color: "lightblue"
    Settings{
        id:settingwindow
        visible: false
    }

    Column{
        anchors.fill: parent
        spacing: 50
        Row{
            spacing: 50
            Button{
                width: 60
                text: "Open"
                onClicked: {
                    settingwindow.visible=true//使设置窗口可见,通过设置串口的apply按钮触发的serialtest.openAndSetPort函数打开和设置串口
                }
            }
            Button{
                width: 60
                text: "Close"
                onClicked: {
                    serialtest.closePort()//关闭串口
                    Qt.quit()
                }
            }
        }

        Grid{
            rows:2
            columns:4
            rowSpacing: 20
            columnSpacing: 40

            Label{
                height: 25
                text: "Send Data : "
                verticalAlignment :Text.AlignVCenter
            }

            TextField {
                id: textInput1
                width: 300
                height: 25
                placeholderText: qsTr("Send Data")
                font.pixelSize: 12
            }
            Label{
                height: 25
                text: "Number of Send Data: "+serialtest.sendnumber//显示发送数据计数
                verticalAlignment :Text.AlignVCenter
            }
            Button{
                id:sendData
                width: 60
                text: "Send"
                onClicked: {
                    serialtest.sendto(textInput1.text);//触发发送数据函数
                }
            }


            Label{
                height: 25
                text: "Receive Data : "
                verticalAlignment :Text.AlignVCenter
            }
            Rectangle{
                height: 300
                width: 300
                color: "lightgreen"
                radius: 10
                Label{
                    anchors.fill: parent
                    id: textreceive
                    font.pixelSize: 12
                    text:serialtest.receivedata
                }
            }

            Label{
                height: 25
                text: "Number of receive Data: "+serialtest.receivenumber//显示接收数据计数
                verticalAlignment :Text.AlignVCenter
            }
            Button{
                width: 60
                text: "Clear"
                onClicked: {//清空接收数据显示,将数据计数清零
                    serialtest.receivedata=""
                    serialtest.sendnumber="0"
                    serialtest.receivenumber="0"
                    serialtest.clearnumber();
                }
            }

        }

    }
}

 

/Settings.qml/
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
Window{
    id:setwindow
    width: 300
    height: 300
    Column{
        id: maincolumn
        anchors.fill: parent
        spacing: 10

        Rectangle{
            anchors.horizontalCenter: parent.horizontalCenter
            height: 1
            width: parent.width
        }
        Label{
            anchors.horizontalCenter: parent.horizontalCenter
            text: "Set Serial Port"
            font.pointSize:12
            font.bold: true

        }
        Grid{
            id:selectgrid
            anchors.horizontalCenter: parent.horizontalCenter
            rows:6
            columns: 2
            columnSpacing: 20
            rowSpacing: 10
            Label{
                id:selectlabel
                height: 20
                text: "PortName:"
                font.pointSize:9
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id :firstcombo
                width: maincolumn.width/2
                currentIndex: 2
                model: [ "COM1", "COM2", "COM3" ,"COM4" ,"COM5" ,"COM6" ]
            }
            Label{
                text: "BaudRate:"
                height: 20
                font.pointSize:selectlabel.font.pointSize
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id: baudRate
                width:firstcombo.width
                currentIndex: 0
                model: [ "9600", "19200", "38400","115200" ]
            }
            Label{
                text: "Data bits:"
                height: 20
                font.pointSize:selectlabel.font.pointSize
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id:dataBits
                width:firstcombo.width
                currentIndex: 3
                model: [ "5", "6", "7", "8" ]
            }
            Label{
                text: "Parity:"
                height: 20
                font.pointSize:selectlabel.font.pointSize
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id:parity
                width:firstcombo.width
                currentIndex: 0
                model: [ "None", "Even", "Odd", "Mark", "Space" ]
            }
            Label{
                height: 20
                text: "Stop bits:"
                font.pointSize:selectlabel.font.pointSize
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id:stopBits
                width:firstcombo.width
                currentIndex: 0
                model: [ "1", "1.5", "2" ]
            }
            Label{
                height: 20
                text: "Flow control:"
                font.pointSize:selectlabel.font.pointSize
                horizontalAlignment : Text.AlignHCenter
                verticalAlignment :Text.AlignVCenter
            }
            ComboBox {
                id:flowControl
                currentIndex: 0
                width:firstcombo.width
                model: [ "None", "RTS/CTS", "XON/XOFF" ]
            }
        }
        Button{
            width: 60
            text: "Apply"
            anchors.horizontalCenter: parent.horizontalCenter
            onClicked: {
                serialtest.openAndSetPort(firstcombo.currentIndex,baudRate.currentIndex,dataBits.currentIndex
                                           ,parity.currentIndex,stopBits.currentIndex,flowControl.currentIndex)
                //触发此函数,由combobox控件的currentIndex作为函数变量,(所有combobox的model值和顺序都和serialtest.openAndSetPort一致,这样就可以通过传递index来获取当前设置信息)
                setwindow.visible=false
            }
        }

    }

}
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;"></span><span style="font-family: Arial, Helvetica, sans-serif;">serialset.h/</span>
 
#include <QObject>
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: QML(Qt Meta-Object Language)是一种用于构建用户界面的声明性语言,而C/C++是一种通用的编程语言。QML与C混合编程是使用这两种语言结合开发应用程序的一种方式。 在QML中,可以使用JavaScript进行逻辑编程和交互操作。而在C/C++中,可以进行复杂的计算、算法实现和底层操作。通过将这两种语言结合在一起,可以充分发挥它们各自的优势,提高应用程序的开发效率和性能。 使用QML与C混合编程时,通常会有一些场景需要注意。首先,需要在C/C++中编写一些类或者函数,然后在QML中进行调用。这就需要进行跨语言的接口和数据传递。通常可以使用Qt提供的机制,如信号与槽(signal and slot)来进行跨语言的通信。 其次,在QML中可以使用Qt的各种GUI组件来构建用户界面,而在C/C++中则可以处理一些底层的计算和数据操作。例如,可以在C/C++中使用Qt的数据结构和算法来处理复杂的数据逻辑,然后将结果传递给QML进行展示。 混合编程还可以提高应用程序的性能。QML中的JavaScript运行速度相对较慢,而C/C++则可以通过编译优化和底层操作来提高执行效率。因此,在一些对性能要求较高的场景下,可以将一些计算密集型的任务交给C/C++来处理,提高整体应用程序的性能。 总结来说,QML与C混合编程可以充分发挥两种语言各自的优势,提高应用程序的开发效率、性能和用户体验。通过合理地利用QML和C/C++,可以开发出功能强大、界面美观且性能优异的应用程序。 ### 回答2: QML(Qt Meta-Object Language)是一种用于快速构建用户界面的声明性编程语言,而C++是一种通用的编程语言。两者结合进行混合编程可以充分发挥各自的优势。 首先,QML具有直观易懂的语法,适合快速开发用户界面。它采用了类似于CSS的声明式风格,允许开发者通过组件和属性的方式构建用户交互界面。QML中可以直接调用C++函数和对象,并通过信号槽机制进行通信,这使得在QML中可以方便地使用C++的功能和库。 其次,C++是一种强大的编程语言,具有高效的性能和广泛的应用领域。通过与QML混合编程,我们可以利用C++的能力来处理复杂的业务逻辑和计算任务。例如,使用C++编写性能要求较高的算法,通过C++的多线程处理并发任务等。 混合编程可以通过QML中的Qt Quick Controls提供更丰富的用户界面控件和样式,通过C++编写的QML插件来实现一些复杂的界面逻辑或业务逻辑。这种结合可以在保持界面的灵活性和用户友好性的同时,实现高效的数据处理和计算。 总结来说,QMLC++混合编程方式可以在开发过程中充分利用两者的优势,快速构建用户界面并处理复杂的业务逻辑。这种结合使得开发人员能够更有效地开发出高性能、用户友好的应用程序。 ### 回答3: qml与C混合编程是指在Qt框架中,同时使用qml和C语言进行开发的一种方式。qml是Qt Quick的一种声明式语言,用于快速构建用户界面,而C语言是一种通用的编程语言,在Qt中常用于底层功能的实现。 qml与C混合编程的主要优点是可以充分利用qml的快速开发和灵活性和C语言的强大功能。qml具有直观的语法和简洁的代码风格,能够快速构建出美观且交互性强的用户界面。同时,qml也具有与C++进行无缝集成的能力,可以调用C++类和函数来实现一些高级的功能。而C语言作为一种通用的编程语言,具有底层的硬件控制和高性能的特点,适合用于一些需要高效计算和硬件交互的场景。通过qml与C混合编程,可以实现高效的用户界面和底层功能的结合,提供优秀的用户体验和性能。 在qml与C混合编程时,一般会使用Qt提供的接口和工具来实现qml与C语言的交互。Qt提供了QCoreApplication类和QObject类等接口,用于qml与C语言之间的通信和数据传递。可以通过qml提供的信号与槽机制,与C语言进行交互和传递数据。在qml中,可以调用C语言的函数来实现一些底层操作,比如文件读写、网络通信等。而在C语言中,可以通过Qt提供的接口,调用qml中的函数和属性,实现界面的更新和事件的处理。 总之,qml与C混合编程是一种灵活且强大的开发方式,可以充分发挥qml的优势和C语言的功能,实现高效的用户界面和底层功能的结合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值