1

PyQt4 を使用してアプリケーション用の独自のツールを作成するために使用できるウィジェットを作成する機能を提供するアプリケーション用のプラグインがあります。QApplication は C++ プラグインによって維持され、「アンカー」ウィジェットはホスト アプリケーションのウィンドウ ハンドルの親になります。その後、ユーザーは独自のウィジェットを作成し、この「アンカー」を親ウィジェットとして使用できます。これは PyQt4 で非常にうまく機能します。最近、私は PySide のサポートを提供しようとしており、.ui ファイルからウィジェットを作成する必要があるまでは、これもうまく機能しています。QUiLoader を使用して .ui ファイルをロードすると、結果のウィジェットが PyQt4 と同じに見えないようです。タイトルなど、.ui ファイルに記述されているレイアウトやその他のプロパティが欠落しているか、スキップされているように見えます。

class ExampleUiFile(QDialog):
    def __init__(self, parent, uifilepath):
        QDialog.__init__(self, parent)

        # load ui file
        loader = QUiLoader(self)
        file = QtCore.QFile(uifilepath)
        file.open(QtCore.QFile.ReadOnly)
        self.ui = loader.load(file, self)
        file.close()

        for k,v in vars(self.ui).items():
            print("%s : %s" % (k,v))

        # connect to the createCube function
        self.ui.uiCreateCube.clicked.connect(self.createCube)

    def createCube(self):
        print(self.ui.uiCubeName.text())

出力..

horizontalLayout : <PySide.QtGui.QHBoxLayout object at 0x0000000023997308>
uiCubeName : <PySide.QtGui.QLineEdit object at 0x0000000023338508>
verticalLayout :<PySide.QtGui.QVBoxLayout object at 0x0000000023997548>
gridLayout : <PySide.QtGui.QGridLayout object at 0x0000000023997E08>
uiCubeLength : <PySide.QtGui.QDoubleSpinBox object at 0x0000000023338808>
uiCreateCube : <PySide.QtGui.QPushButton object at 0x0000000023338988>

そこで、これを修正するために、ここや他の場所を掘り下げて、QUiLoader のサブクラス化の例を見つけました。最初の基本クラスを返すために追加の作業を行う QUiLoader を継承する単純なクラスをコピーできました。この男は働いていたようで、私のダイアログは正しく見え、正しいタイトルが表示され、レイアウトとサイズ変更が機能します。残念ながら、ガベージ コレクターは、ローダー クラスが作成したすべてのウィジェットを削除し、オブジェクトが削除されているというメッセージを受け取ります...

class UiLoader(QUiLoader):
    def __init__(self, baseinstance):
        super(UiLoader, self).__init__(baseinstance)
        self._baseinstance = baseinstance

    def createWidget(self, classname, parent=None, name=""):
        widget = super(UiLoader, self).createWidget(
            classname, parent, name)

        if parent is None:
            return self._baseinstance
        else:
            setattr(self._baseinstance, name, widget)
            return widget

新しいサブクラス ローダーを使用した出力...

Internal C++ object (PySide.QtGui.QLineEdit) already deleted.

私はこの問題について多くの調査を行いましたが、過去の PySide のいくつかのバグが原因であると思われましたが、修正された PySide 1.1.2 を使用しています。1.1.3dev を使用してソースから PySide をビルドしましたが、それでも同じです。ホスト アプリケーション以外では、このサブクラス化の問題を再現できなかったことを付け加えておきます。期待どおりに機能する単純な python/PySide の例を作成できました。

ここからどこへ行けばいいですか?機能がなくても見栄えの良い UI を取得したり、機能を備えた見苦しい UI を取得したりします。カスタムウィジェットなどで派手なことは何もしていないので、QUiLoader をサブクラス化しないことをお勧めします。

4

0 に答える 0