1、Qt开发的动态库是由qml+qt自定义实现的图形界面库,具有自己的事件循环,便于响应界面的信号槽操作;
2、调用Qt自定义图形界面库的外部主程序可能是标准C/C++程序,也可能是MFC程序;
请教高手,如何在Qt开发的动态库(qml+Qt)中实现自己的事件循环?如何实现由外部程序调用该Qt的gui界面库?
谢谢!谢谢!
QT开发动态库首先你要提供接口供外部调用,你可以在这个接口里面创建一个新线程,实现QT的循环。
外部调用动态库就简单了,直接调用QT动态库提供的接口就OK
您的意思是说,在动态库中定义导出的方法,方法中创建线程;
然后这个线程中启用Qt的事件循环?那我的Qt的其他的界面逻辑及信号槽的响应怎么才能在该线程中事件循环中执行?需要将响应信号槽的对象放到这个线程中吗?
@踏云:
导出接口中创建线程,线程里面运行主窗口。其他窗口当然也是由主窗口管理的了。
相当于把一个独立的QT程序封装成动态库,把main函数封装成接口供外部调用。
新线程主体内容如下:
QApplication app(argc, argv);
pMainWindow = new MainWindow();
pMainWindow->show();
app.exec();
@nanqiang: Qt程序部分与外部的数据通信,一般采用什么方式呢?
@踏云:
也是用接口,封装QT界面库一般按下面步骤
1、写一个接口类,包括调用QT界面入口的接口、通信接口等等(这个接口类需要提供给动态库使用者的)
2、写一个类实现接口,实现QT界面入口时需要创建一个新线程,运行QT循环
外部通信都通过主界面进行管理,主界面与其他界面通过信号槽通信
@nanqiang: 外部通信通过主界面管理?怎么理解?调用动态库的程序,可能不是Qt,可能是标准C++,也可能是MFC等,所以是无法响应信号槽的。
@踏云:
外界与主界面通信用接口啊,标准c++的接口
@nanqiang: 多谢了,我先尝试一下,看一下结果,无论如何后面会将园豆奉上,表示感谢!
@nanqiang: 尝试了一下,我在线程的run方法中执行如下:
int argc = 0;
char **argv = NULL;
QApplication app(argc,argv);
Dialog diag;
diag.show();
app.exec();
这样处理后,窗口显示了,但是上面的所有按钮,包括默认的关闭按钮,都无法点击,或点击没有响应;
有个告警信息:WARNING: QApplication was not created in the main() thread.
您这了解什么原因吗?
@nanqiang: 我到网上找了一下,好像真不行,QApplicatioin的ui操作只能在主线程中,不能在次线程中。
我的目的是完全屏蔽Qt与C++,Qt只做界面信号槽、事件循环只在Qt侧进行,不要影响主线程的C++的运行,然后双方还能互相通信;
@踏云:
不在主线程这个告警信息是有的,不影响
按钮点击不了应该是argc,argv不对,参数最少要两个。argv[0]是主程序名称(要带绝对路径 ),argv[1]是“-qws”。
如果还不行,那就不要在动态库创建线程了,让外部调用程序在主线程调用QT动态库的入口函数,运行QT循环。需要注意,这样外部程序的主线程会一直阻塞在这个QT循环里
@踏云:
封装QT动态库我是不用ui设计师的,我的界面都是纯代码写的
@nanqiang: 我从主程序中奖argc和argc都传到子线程中的QApplication中了,添加了1个按钮,增加了一个槽,槽中弹出QMessageBox,增加的按钮槽函数可以响应;
但是MainWindow关闭、缩小,以及QMessageBox窗口都无法关闭,按钮点击无效或无法点击;
用设计师或代码编写,我觉得都得用QWidgets或其子类吧。
@nanqiang: 另外,我打印了argc和argv,argc是1,只有1个argv[0]的值。
@nanqiang: 还想请问一下,您的动态库中的线程中的界面应该也包含Widget吧?是不是所有的信号槽都响应?界面弹出界面,都还可以进行关闭,再点击等操作?