我们知道,一般性的Qt应用程序,是有自己的事件循环,在main()函数中,一般情况下会这样写代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.show();
return a.exec();
}
当调用a.exec()后,主程序就会阻塞在这里,并且开启Qt自身的消息循环和处理。那么如果想在dll中嵌入Qt界面并实现Qt正常的工作,就必然少不了在dll中实现Qt事件循环,包括QApplication::exec()的调用。
所以在MFC调用dll之前,dll不仅仅是需要创建内部的Qt界面或者控件,而且也需要开启Qt的事件循环,最简单的方法就是开启单独的一个线程,用来作为Qt的事件循环。具体的实现就是初始化dll的接口中开启一个线程,在该线程中实现如下代码:
int argc = 1;
TCHAR targv[MAX_PATH] = { 0 };
GetModuleFileName(NULL, targv, MAX_PATH);
USES_CONVERSION;
std::string strPath = T2A(targv);
char argv[MAX_PATH];
memcpy(argv, strPath.c_str(), strPath.length());
char* pargv = argv;
QApplication* a= new QApplication(argc, &pargv);
// 这里创建dll内部的Qt界面例如QWidget
QWidget w;
w.show();
a.exec();
当调用a.exec()之后,该线程就被阻塞在这里,该线程就是实现QWidget的事件循环的线程动力。当需要结束这个事件循环,或者关闭这个dll中界面时,我们需要调用a->quit();来结束QApplication。
以上是MFC作为主程序来调用dll的实现。