1

我知道使用套接字将 vim 嵌入到Gtk 应用程序中,如下所示

from gi.repository import Gtk
import subprocess

win=Gtk.Window()
win.set_default_size(600,800)
win.connect('delete-event', Gtk.main_quit)
editor = Gtk.Socket()
win.add(editor)
editor.connect("plug-removed", Gtk.main_quit)
subprocess.Popen(["/usr/bin/gvim", \
        "--socketid", str(editor.get_id())])
win.show_all()
Gtk.main()

在PySide中如何做到这一点?我在 pyside 中找不到任何对套接字的引用。

更新(使用 JimP 的想法)

以下代码在 Pyside 小部件中嵌入了一个 gvim 实例。然而,gvim 窗口似乎没有调整到父窗口的完整大小。

import sys
from PySide import QtGui
from PySide import QtCore

app = QtGui.QApplication(sys.argv)    
win = QtGui.QWidget()
win.resize(600, 800)

container = QtGui.QX11EmbedContainer(win)
container.show()
QtCore.QObject.connect(container, 
    QtCore.SIGNAL("clientClosed()"), 
    QtCore.QCoreApplication.instance().quit)
winId = container.winId()
process = QtCore.QProcess(container)
options = ["--socketid", str(winId)]
process.start("gvim", options)

win.show()    
sys.exit(app.exec_())
4

1 回答 1

2

我认为让这项工作发挥作用的关键是将 GTK 语言翻译成 QT 语言。围绕你的代码谷歌,我看到Gtk.Socket说:

GtkSocket 和 GtkPlug 之间的通信遵循 XEmbed 协议。该协议也已在其他工具包中实现,例如 Qt,当在 GTK 中嵌入 Qt 小部件时允许相同级别的集成,反之亦然。

那么问题就变成了 QT 将他们的 XEmbed 类称为什么?谷歌周围我发现QX11EmbedContainer说:

PySide.QtGui.QX11EmbedContainer 可以从 Qt 以外的工具包(例如 GTK+)嵌入 XEmbed 小部件。也可以嵌入任意(非 XEmbed)X11 小部件,但 XEmbed 特定的功能(例如窗口激活和焦点处理)将丢失。

PySide.QtGui.QX11EmbedContainer 的 GTK+ 等价物是 GtkSocket。相应的 KDE 3 小部件称为 QXEmbed。

我目前没有运行 PySide,但是 QX11EmbedContainer 上的那个页面包含一些示例 C++ 代码,我认为这些代码可以让你到达你需要的地方。您需要将 C++ 翻译成 Python,但我认为这不会太难。

于 2012-11-19T15:38:07.447 回答