如何混合 C++ Qt 对象和 Qt Jambi 对象
Posted
技术标签:
【中文标题】如何混合 C++ Qt 对象和 Qt Jambi 对象【英文标题】:How to mix C++ Qt objects and Qt Jambi objects 【发布时间】:2009-12-13 12:57:26 【问题描述】:我正在尝试将一些用 C++ 编写的现有 Qt 代码与一些使用 Qt Jambi 用 Java 编写的代码结合起来,但我不太确定如何去做。我基本上是在尝试实现两件事:
-
使用 JNI 将 QObject 从 C++ 传递到 Java
将 Qt Jambi QObject 从 Java 传递到 C++
看起来我可以直接传递指针,然后在 Java 端将其包装在 QNativePointer 中,但我不知道如何将 QNativePointer 转回由 Qt Jambi 包装的原始对象。
例如:我可以将 QWidget* 作为 long 传递给 Java,然后在 Java 中创建一个 QNativePointer,但是我怎样才能从中构造一个 QWidget? QJambiObject 和 QObject 似乎没有“setNativePointer”方法,我不知道如何转换它。
在 C++ 中:
QWidget* widget = ...
jclass cls = env->FindClass("Test");
jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
env->CallStaticVoidMethod(cls, mid, int(widget));
在 Java 中:
public class Test
public static void test (int ptr)
QNativePointer pointer = new QNativePointer(QNativePointer.Type.Int);
pointer.setIntValue(ptr);
QWidget widget = ...
谢谢!
【问题讨论】:
【参考方案1】:我不希望这是可能的方式,你正在努力实现这一点。如果我正确理解您的方法,那么您会以某种方式尝试将 C++ QWidget 对象的内存表示转换为 Java QWidget 对象。这只有在 Java 和 C++ 对象的内存表示相同时才有效,我对此表示严重怀疑。
即使是这样,它也可能不会起作用,因为我很确定,QWidget 类的 QtJambi 版本不是 C++ QWidget 类的一对一克隆。
为此,您必须以某种方式读取 C++ QWidget 的值,创建一个 QtJambi QWidget 对象,然后将这些值设置为新的 QtJambi 小部件。我不知道有一种转换方法可以完成这项工作,我也不确定这是否可行。
【讨论】:
实际上,在旧版本的 Qt Jambi(我不记得是哪个副手)中,QJambiObject 中有一个 fromNativePointer() 或类似的东西,“看起来”像我想要的。在最新版本中,它似乎没有记录。一直忙于其他事情,但还没有机会测试它...... 据我所知,Jambi 小部件包装了本机小部件,通过内部指针将方法调用代理到本机小部件。在占碑中,所有 QObjects 都派生自 QJambiObject,其中也包含 QNativePointer。我可能是错的,但看起来确实如此。 Jambi 生成器几乎完全自动包装小部件(有些事情需要手动完成)。 啊,我忘了重点,每个 QtJambi 对象实际上都必须有一个指向相应 C++ Qt 对象的链接。所以实际上你提到的方法可以工作。但是这些方法是否被记录是值得怀疑的,如果它们现在没有记录,在不久的将来,面对这样一个事实,即奇趣科技放弃了 QtJambi 项目,目前正试图将其转变为一个基于社区的项目。【参考方案2】:对于正在查看此内容的其他人,请查看以下内容: http://labs.trolltech.com/blogs/2007/08/24/extremely-interesting-jambi-trick-x-instantiating-java-widgets-from-c/
尤其是这部分:
qtjambi_from_QWidget() 调用将 要么创建一个新的 Java 小部件,如果 父小部件是用 C++ 创建的,或者 它将返回现有的 Java 如果父对象是在其中创建的 爪哇。如果它必须创建一个新的 java 对象, this 的类型将是 Qt 已知的最接近的 Java 超类型 占碑。如果您已经映射了自己的 C++ 小部件并希望正确使用它们 在诸如此类的电话中,您必须 确保初始化代码 您生成的库被称为优先 到转换发生。还 请注意,在 qtjambi_core.h 你会 找其他几个方便 可以使用的转换函数 在 C++ 之间来回转换 和JNI,以及其他方便, 基于 JNI 的代码。
【讨论】:
以上是关于如何混合 C++ Qt 对象和 Qt Jambi 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 7 的 Eclipse 中安装 Qt-Jambi?
如何在 TeamCenter 富客户端中使用 Qt Jambi 初始化 QApplication