QML与c++线程类

QML与c++线程类

因需要开发手机软件给嵌入式设备升级,c++ QFileDialog在手机端打开文件选择窗口时总是会闪退,无奈学习了下公司大佬的qml代码,又从网上查找了些资料。解决了线程与qml通信问题
QML中添加一个c++的类

我们可以先创建一个C++类,创建好后,在main.cpp文件中将这个类注册成qml中可用的一个项目

main.cpp
    qmlRegisterType<qml_interface>("qml_interface",1,0,"Myqmlinterface");

其中第一个qml_interface是你的类名,第二个qml_interface是你在QML运用改类时要导入的文件包名 1,0为版本号,Myqmlinterface是你在QML使用时输入的名称;
如下,第一行导入该类,第三行创建该类

import qml_interface 1.0
Window{
	Myqmlinterface{
    	    id:qmlinterface
	}
}

我们在此类创建线程,将线程的信号槽与该类中的信号槽相连接,即通过这个中间类,完成线程与QML的连接

qml_interface::qml_interface(QObject *parent) : QObject(parent)
{
    int_button = 1;

    init_data();

    mydatathread = new DatAnalyze;
    mythreadD = new QThread;
    mydatathread->moveToThread(mythreadD);

    connect(this,SIGNAL(sig_test_send(QByteArray)),mydatathread,SLOT(slot_test_send(QByteArray)));

    //信号槽连接
    connect(this,SIGNAL(sig_floor_clicked(int)),mydatathread,SLOT(slot_floor_clicked(int)));
    connect(mydatathread,SIGNAL(sig_display(int, unsigned char)),this, SLOT(slot_display(int, unsigned char)));

    mythreadD->start();

}

void qml_interface::get_floor_data()
{
    emit sig_floor_clicked(floor_inf);
}

void qml_interface::slot_display(int floor, unsigned char statu)
{
    if(statu == 0x00){
        emit sig_display(floor,0);
    }else if(statu == 0x10){
        emit sig_display(floor,1);
    }else if(statu == 0x20){
        emit sig_display(floor,2);
    }
}

你可能感兴趣的:(QML,c++,线程)