2

QWizardを作成していて、ファイルを表すコンボボックスが必要です。コンボボックスにはファイル名が表示されますが、パス全体が必要なので、コンボボックスのuserDataにパスを保存しています。別のウィザードページでコンボボックスデータにアクセスするには、registerFieldを使用します。コンボボックスには、currentIndexやcurrentTextのようなcurrentDataメソッドがないため、currentDataメソッドを持つ独自のコンボボックスを作成しました(私の場合、常にQStringを返すので、currentStringDataと呼びます)。この新しい関数名を「property」パラメーターとしてregisterFieldに渡すと、結果が得られません。

ぐるぐる回って、QtCentreに関する他の誰かの質問に行きました-彼らは同じ質問をしましたが、それはC ++であり、C++の例からPythonに変換するのに苦労しています。http://www.qtcentre.org/threads/13858-QWizard-QComboBox-and-registerField()-issue。派生クラスからの放出が欠落していると思いますが、それが当てはまるのか、それをどのように行うのかはわかりません。

Pythonでこれを行う方法を知っている人はいますか?

問題を示す非常に単純なPythonスクリプトを作成しました。

#!/usr/bin/env python

from PyQt4 import QtCore,QtGui

class QIComboBox(QtGui.QComboBox):
    def __init__(self,parent=None):
        super(QIComboBox, self).__init__(parent)

    def currentStringData(self):
        return self.itemData(self.currentIndex()).toString()


class VariantWizard(QtGui.QWizard):
    def __init__(self, parent=None):
        super(VariantWizard, self).__init__(parent)

        self.addPage(Page1())
        self.addPage(Page2())

        self.setWindowTitle("QVariant Test")
        self.resize(640,480)

class Page1(QtGui.QWizardPage):
    def __init__(self, parent=None):
        super(Page1, self).__init__(parent)

        self.version_combo = QIComboBox(self)
        self.version_combo.addItem("foo","/path/to/foo")
        self.version_combo.addItem("bar","/path/to/bar")

        self.registerField("version",self.version_combo,"currentStringData")

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.version_combo)
        self.setLayout(layout)

class Page2(QtGui.QWizardPage):
    def __init__(self, parent=None):
        super(Page2, self).__init__(parent)

        path = self.field("version")
        label1 = QtGui.QLabel("raw path is '%s'" % path)
        label2 = QtGui.QLabel("string path is '%s'" % path.toString())

        layout = QtGui.QVBoxLayout()
        layout.addWidget(label1)
        layout.addWidget(label2)
        self.setLayout(layout)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    wizard = VariantWizard()
    wizard.show()
    sys.exit(app.exec_())

この例では、2番目のページの最初のラベルは、コンボボックスアイテムに応じて、「raw path is'/ path / to/foo'」または「rawpathis'/path / to/bar'」のいずれかになると予想されます。 Page1で選択されました。currentStringDataはすでにQStringを返しているはずなので、2番目のラベルはエラーになると思います。

代わりに、「raw path is '<PyQt5.QtCore.QVariant object....>'」と「」を取得してstring path is ''います。

4

1 に答える 1

2

ここでいくつかの重要な詳細が欠落しています。まず、ウィジェットの既存のプロパティを経由して読み取らない場合はfield()、独自のプロパティを定義する必要があります(currentItemDataこの場合)。ここで@pyqtProperty説明されているように、デコレータを介してそれを行うことができます。あなたの場合、新しいプロパティはクラスで定義する必要があります。次に、ページが表示されようとしているときに、他のページフィールドに基づいてページコンテンツを初期化する(再実装された)メソッドを呼び出す必要があります(ここで例を見ることができます)。QIComboBoxinitializePage()

コードの動作バージョンは次のとおりです。

#!/usr/bin/env python

from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtCore import pyqtProperty

class QIComboBox(QtGui.QComboBox):
    def __init__(self,parent=None):
        super(QIComboBox, self).__init__(parent)

    @pyqtProperty(str)
    def currentItemData(self):
        return self.itemData(self.currentIndex()).toString()

class VariantWizard(QtGui.QWizard):
    def __init__(self, parent=None):
        super(VariantWizard, self).__init__(parent)
        self.addPage(Page1(self))
        self.addPage(Page2(self))
        self.setWindowTitle("QVariant Test")
        self.resize(640,480)

class Page1(QtGui.QWizardPage):
    def __init__(self, parent=None):
        super(Page1, self).__init__(parent)
        self.version_combo = QIComboBox(self)
        self.version_combo.addItem("filename1","/path/to/filename1")
        self.version_combo.addItem("filename2","/path/to/filename2")
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.version_combo)
        self.setLayout(layout)

        self.registerField("version",self.version_combo, "currentItemData")

class Page2(QtGui.QWizardPage):
    def __init__(self, parent=None):
        super(Page2, self).__init__(parent)
        self.label1 = QtGui.QLabel()
        self.label2 = QtGui.QLabel()
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.label1)
        layout.addWidget(self.label2)
        self.setLayout(layout)
    
    def initializePage(self):
        path = self.field("version")
        self.label1.setText("raw path is '%s'" % path.toString())
        self.label2.setText("string path is '%s'" % path)
        
if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    wizard = VariantWizard()
    wizard.show()
    sys.exit(app.exec_())
于 2012-10-30T15:32:37.467 に答える