将 PySide/PyQt 小部件嵌入到 Qt/C++ 应用程序中
Posted
技术标签:
【中文标题】将 PySide/PyQt 小部件嵌入到 Qt/C++ 应用程序中【英文标题】:Embeding PySide/PyQt widget into Qt/C++ application 【发布时间】:2014-03-21 08:25:22 【问题描述】:我有一个 C++/Qt 应用程序,它的 GUI 应该可以通过模块进行扩展。扩展应该简单而通用。我只是在检查一个概念 - 是否有可能让这个主 C++/Qt 应用程序执行 Python/PySide/PyQt 脚本,该脚本将创建一个 QWidget(或派生类)实例并将这个小部件嵌入到主 C++/Qt 应用程序中?
是否有任何工作的 sn-p 来证明这项任务的可行性? IE。如何创建和嵌入小部件?如何在应用程序和小部件之间传递信号?
【问题讨论】:
当然我有......但没有发现任何有用的东西。 【参考方案1】:这个问题有点老了,但如果其他人面临同样的问题,我会尝试给出一个有用的答案。
我认为这是可能的。在下面的示例中,我在 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 提供的链接所示。
【讨论】:
在 Debian 9 (Stretch) 上使用为Qt4
构建的 PySide
就像魅力一样【参考方案2】:
我认为这是不可能的。 PySide/PyQt 是 C++/Qt 的包装器。这意味着您创建 C++ 对象和 Python 包装器对象,并且包装器对象以某种方式引用 C++ 对象。据我所知,这是一种方法。
但你想要另一种方式。基本上是 Python 对象的包装器(它们本身就是 C++ 对象的包装器)以在 C++ 中使用。我认为 PySide/PyQt 还没有为此做好准备。不过可以embed Python in other languages。
另请参阅How to shoot yourself in the foot.,了解 C++/Qt 和 Python 之间的通信陷阱。
【讨论】:
以上是关于将 PySide/PyQt 小部件嵌入到 Qt/C++ 应用程序中的主要内容,如果未能解决你的问题,请参考以下文章
PySide/PyQt 中 QTableWidget 的 QMenu
PySide/PyQT5:如何从 QGraphicsItem 发出信号?
如何在PySide / PyQt中连接QApplication()和QWidget()对象?
PySide/PyQt4:向 QTableWidget Horizontal (column) Header 添加一个复选框