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);
}
}