环境配置:
Win10 X64
Python 3.5.2 32 bit
Qt 5.5.1 MinGW 4.9.2 32.bit
Qt DLL代码实现:
1 extern "C" __declspec(dllexport) void showMessageWindow(char *msg) 2 { 3 QMessageBox::information(nullptr, "Title", msg); 4 } 5 6 extern "C" __declspec(dllexport) int add(int num1, int num2) 7 { 8 return num1 + num2; 9 }
python调用代码:
1 from ctypes import * 2 dll = cdll.LoadLibrary("QtDllTest.dll") 3 print("add result=", dll.add(1, 2)) 4 dll.showMessageWindow(b"Hello, Python Call C++!");
python执行结果:
代码说明:
1. python正常调用add函数。执行结果打印出了"add result= 3";
2. python调用showMessageWindow失败。showMessageWindow设计GUI模块。
问题: python如何调用Qt带有GUI模块的DLL?
本人的探索:
1. python可以正常调用VC带UI的DLL.
2. 网上资料建议在可执行程序下,加入Qt5.5.1/5.5/mingw492_32的platforms和plugins目录下所有内容.结果仍然出现上面的错误.
extern "C" __declspec(dllexport) void showMessageWindow(char *msg)
{
QMessageBox::information(nullptr, "Title", msg);
}
由于你是第三方exe调用的DLL,因此你需要初始化QT的界面事件循环,具体的时刻可以在DLL_ATTACH之类的DLL入口函数处,在这个时刻初始化 QApplication a(argc, argv) 这类信息
谢谢!
QCoreApplication* createApplication(int &argc, char *argv[]) { for (int i = 1; i < argc; ++i) if (!qstrcmp(argv[i], "-no-gui")) return new QCoreApplication(argc, argv); return new QApplication(argc, argv); } int main(int argc, char* argv[]) { QScopedPointer<QCoreApplication> app(createApplication(argc, argv)); if (qobject_cast<QApplication *>(app.data())) { // start GUI version... } else { // start non-GUI version... } return app->exec(); }
可以解决问题!