python - 我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定(bind)吗?

标签 python c++ qt swig

如何使用SWIG绑定(bind)QT应用,我们的情况和这个post的情况差不多。 ,它说:

  • We have a big C++/Qt application with a Swig binding of the core.
  • We wanted to create new UI tools in python which need to use some of our C++ widgets. So we need a binding of our C++ widgets. As our core binding is written in Swig (and we are happy with that) we need to bind our widgets with the same binding tool for compatibility.

似乎他们已经成功地在 SWIG 中创建了 Qt 的绑定(bind),但是使用 swig 包装 QT 似乎并不容易,因为带有宏 Q_OBJECT 的 QT 应用程序将在预编译时生成 moc 文件,并在编译时使用这些文件。我试过这个:

>> swig -c++ -python application.i
application.h:46: Error: Syntax error in input(3)

它总是给出关于指示 Q_OBJECT 的第 46 行的错误。

我还找到了herehere说不可能使用 swig 来包装 QT,我对此很困惑,如果它不可行或者如果可行,有人可以对此进行一些说明,举一个关于使用 SWIG wrap QT 的简单示例。提前致谢。

更新源文件:application.h

#ifndef   APPLICATION_H_
#define   APPLICATION_H_

#include <QApplication>

class frameApplication : public QApplication
{
    Q_OBJECT

public:
    frameApplication (){};
    virtual ~frameApplication();

private slots:
    void OnExitApp();

};
#endif  // APPLICATION_H_

应用.i

%module application
%{
#include "application.h"
%}
%include "application.h"

这是 application.h 的简化版本,使用上面的 SWIG 命令,除了行号之外,错误消息保持不变。

最佳答案

Can we use SWIG to make python bindings for Qt application?

!

发生错误是因为您的头文件使用了 SWIG 不知道的宏。当然,C++ 编译器也不会知道它们。

SWIG 需要预处理您的输入。为此,它需要知道 Qt 的包含路径,以及 Qt header 工作所需的定义。

在我使用 Widgets 包的特定项目中,在 OSX Qt 安装中,SWIG 需要以下参数,例如:

-DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB \
-I/Qt/5.6.0/lib/QtWidgets.framework/Headers \ 
-I/Qt/5.6.0/lib/QtGui.framework/Headers \ 
-I/Qt/5.6.0/lib/QtCore.framework/Headers \ 
-I/Qt/5.6.0/mkspecs/macx-clang

SWIG 在对丢失的包含文件保持沉默方面发挥了很大作用。即使包含文件丢失,它也会尽力解析输入,并对各种标识符做出一些假设,即使它们是未定义的,但是当出现不只是扩展为单个标识符。

获取必要的定义 (-D) 和包含路径 (-I) 选项的最简单方法是构建您的代码并从编译器的命令行中获取这些选项. SWIG 有目的地使用与大多数 C/C++ 编译器相同的选项语法 - 以便更轻松地传递数据。

应该说 SWIG 对信号和槽没有任何特殊了解:它们只是 C++ 方法。 SWIG 生成的任何绑定(bind)都不支持使用 Qt 5 的新 connect 语法来链接信号和插槽。您仍然可以使用 Qt 4 语法,将 C 字符串方法签名传递给 connect,例如:

// with SIGNAL/SLOT macros
connect(obj1, SIGNAL(foo(QString)), obj2, SLOT(bar(QString)));
// without SIGNAL/SLOT macros - as you would call from a SWIG binding
connect(obj1, "2foo(QString)\0", obj2, "1bar(QString)\0");

方法签名需要以额外的空终止符作为后缀。信号以 '2' 为前缀,槽以 '1' 为前缀,其他可调用方法以 '0' 为前缀。

除非使用私有(private)的QMetaObjectBuilder,否则您将无法定义新的信号或可调用的方法;见here .

关于python - 我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708475/

相关文章:

python - Python 中的龙曲线

Python 统一码 : why in one machine works but in another one it failed sometimes?

python - Pandas :检查列值是否小于任何先前的列值

c++ - 接收错误变量的类型不完整 "void"

C++ Qt 和 WinExec - 将 CMD 输出保存到特定文件夹中的文件

python - "ImportError: libcublas.so.10.0"仅在使用 GUI 时用于 Tensorflow

c++ - 在 bash 中捕获线程转储

c++ - 使用 pthread_cancel : good practice or bad 取消线程

c++ qt API 适用于 Excel 2010 但不适用于 excel 2013

mysql - Qt静态构建与静态mysql插件混淆