首页 新闻 会员 周边 捐助

问题: python如何调用Qt带有GUI模块的DLL?

-1
悬赏园豆:160 [已解决问题] 解决于 2016-12-19 17:49

环境配置:
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目录下所有内容.结果仍然出现上面的错误.

xiaopingge的主页 xiaopingge | 初学一级 | 园豆:60
提问于:2016-12-12 15:20
< >
分享
最佳答案
3

extern "C" __declspec(dllexport) void showMessageWindow(char *msg)

 {

 QMessageBox::information(nullptr, "Title", msg);

}

由于你是第三方exe调用的DLL,因此你需要初始化QT的界面事件循环,具体的时刻可以在DLL_ATTACH之类的DLL入口函数处,在这个时刻初始化 QApplication a(argc, argv) 这类信息

收获园豆:160
2012 | 高人七级 |园豆:21645 | 2016-12-14 18:49

谢谢!

xiaopingge | 园豆:60 (初学一级) | 2016-12-19 17:46
其他回答(1)
2
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();
}        

可以解决问题!

xiaopingge | 园豆:60 (初学一级) | 2016-12-13 09:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册