将PySide / PyQt小部件嵌入到Qt / C ++应用程序中

时间:2014-03-21 08:25:22

标签: qt pyqt pyside

我有一个C ++ / Qt应用程序,它的GUI可以通过模块扩展。扩展应该简单而通用。我只是检查一个概念 - 是否可以使用这个主要的C ++ / Qt应用程序来执行Python / PySide / PyQt脚本,该脚本将创建一个QWidget(或派生类)实例并将此小部件嵌入到主C ++ / Qt应用程序中?

是否有任何工作片段来证明此任务的可行性?即如何创建和嵌入小部件?如何在应用程序和小部件之间传递信号?

2 个答案:

答案 0 :(得分:2)

这个问题有点陈旧,但如果其他人面临同样的问题,我会尝试给出一个有用的答案。

我认为这是可能的。在下面的例子中,我在c ++中创建了一个QApplication和QMainWindow,嵌入了一个python解释器,然后,在python端,我创建了一个QPushButton,我将其添加到主窗口。

试试这个:

#include <QApplication>
#include <QMainWindow>

#include <iostream>
#include "Python.h"

class PythonQt
{

public:

  PythonQt()
  {
    char name[] = "test";
    Py_SetProgramName(name);
    Py_Initialize();

    std::string code =
        "from PySide import QtGui\n"
        ""
        "all_widgets = QtGui.QApplication.instance().allWidgets()\n"
        "window = None\n"
        "for widget in all_widgets:\n"
        "    if str(widget.objectName()) == \"main_window\":\n"
        "      window = widget\n"
        "      break\n"
        ""
        "def message_box():\n"
        "    QtGui.QMessageBox.information(None, 'Test', 'Hello!', \ 
                      QtGui.QMessageBox.Ok)\n"
        "    QtGui.QApplication.instance().quit()\n"
        ""
        "button = QtGui.QPushButton('Press Me')\n"
        "button.clicked.connect(message_box)\n"
        "window.setCentralWidget(button)\n"
        "window.move(600, 300)\n"
        "window.show()";

    PyRun_SimpleString(code.c_str());
  }

};

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QMainWindow win;
  win.setObjectName("main_window");

  PythonQt python_code;

  a.exec();
}

python脚本以字符串形式写在一个文件中,但你可以从.py文件中读取它。

对象所有权可能是一个问题,如Trilarion给出的链接所示。

答案 1 :(得分:1)

我不认为这是可能的。 PySide / PyQt是C ++ / Qt的包装器。这意味着您创建了C ++对象和Python包装器对象,并且某种程度上包装器对象引用了C ++对象。据我所知,这是一种方式。

但你想要另一种方式。基本上是在C ++中使用Python对象(它们本身就是C ++对象的包装器)的包装器。我不认为PySide / PyQt已经准备好了。但是可以embed Python in other languages

另见How to shoot yourself in the foot.关于C ++ / Qt与Python之间沟通的缺陷。