1

次のスニペットのようなソケットを使用してGtkアプリケーションにvimを埋め込むことを知っています

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のアイデアを使用)

次のコードは、GvimインスタンスをPysideウィジェットに埋め込みます。ただし、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は、GTK+などのQt以外のツールキットからXEmbedウィジェットを埋め込むことができます。任意の(XEmbed以外の)X11ウィジェットを埋め込むこともできますが、ウィンドウのアクティブ化やフォーカス処理などのXEmbed固有の機能は失われます。

PySide.QtGui.QX11EmbedContainerに相当するGTK+はGtkSocketです。対応するKDE3ウィジェットはQXEmbedと呼ばれます。

現時点ではPySideを実行していませんが、QX11EmbedContainerのそのページには、必要な場所にアクセスできると思われるC++コードの例がいくつか含まれています。C ++をPythonに変換する必要がありますが、それはそれほど難しいことではありません。

于 2012-11-19T15:38:07.447 に答える