通过Boost Python模块运行C++ Qt应用程序

0 投票
2 回答
1043 浏览
提问于 2025-04-16 23:17

有没有办法通过Python把一个Qt图形界面应用程序当作Boost模块来运行?之前这个程序可以作为标准的C++可执行文件运行,但现在我把它编译成了一个共享库,想从Python中启动它。现在每次我从解释器中运行simpleMain()时,它都会进入Python解释器。也就是说,每次我都会看到新的“Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)”的欢迎信息,而且当我关闭解释器时,我的程序会崩溃。此外,我不能直接调用主函数,因为我不太确定如何把Python列表转换成char*。把字符串转换成char似乎比较简单。

这是我用来启动它的Python代码:

import libsunshine

libsunshine.simpleMain()

这是我的C++代码:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(libsunshine)
{
    def("say_hello", say_hello);
    def("simpleMain", simpleMain);
    def("main", main);
}

int simpleMain()
{
   char* args[] = {};
   main(0,args);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Sunshine w;
    w.show();
    return a.exec();
}

2 个回答

0

嗯,通常情况下,main函数是这样调用的:

argc == 1

即使没有参数,argc[0] 也会是可执行文件的名称。

另外,argv 这个参数应该是一个指向字符串的指针列表,最后以一个空指针结束,而你这里什么都没传。如果 QApplication 处理参数列表的方式不对(可能会根据 argc 循环,或者只是查找空指针),那么如果传入的 argc 是零的话,可能会导致程序崩溃。
你可以试试:

char *args[1] = { NULL }; main(0, args);

或者

char *args[2] = { "Dummy name", NULL }; main(1, args);
0

你可以用PyQt来写你的应用程序设置,这个过程非常简单,就像下面这样:

import sys
from PyQt4 import QtGui    
QtGui.QApplication(sys.argv)

在你脚本的开头部分。然后你可以在你的模块中调用C++代码,这样就可以打开、关闭窗口等等。(我有代码是这样工作的)

我觉得在C++中调用main函数是不合法的,这可能是导致程序崩溃的原因。

撰写回答