我知道将vim嵌入Gtk application使用套接字,如下面的代码段
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_())
答案 0 :(得分:2)
我认为实现这项工作的关键是将GTK转换为QT。 Google围绕您的代码,我看到Gtk.Socket说:
GtkSocket和GtkPlug之间的通信遵循XEmbed 协议。该协议也已在其他工具包中实现, 例如Qt,在嵌入Qt时允许相同的集成度 GTK中的小部件,反之亦然。
那么问题就变成QT调用他们的XEmbed类了吗?谷歌周围我发现QX11EmbedContainer说:
PySide.QtGui.QX11EmbedContainer可以嵌入XEmbed 来自Qt以外的工具包的小部件,例如GTK +。随意 (非XEmbed)X11小部件也可以嵌入,但XEmbed特定 然后会丢失窗口激活和焦点处理等功能。
PySide.QtGui.QX11EmbedContainer的GTK +等价物是GtkSocket。 相应的KDE 3小部件称为QXEmbed。
我目前没有运行PySide,但是QX11EmbedContainer上的那个页面包含一些示例C ++代码,我认为这些代码可以帮助您实现目标。你需要将C ++翻译成Python,但我不会那么难。