6

私のプログラムの定期的な間隔の間に、(3つの積み重ねられた)ブロックウィジェットを水平レイアウトに追加する必要があります。各ブロック内のウィジェットは相互に重要であるため、各スタックを独自のウィジェットとしてカプセル化する必要があります(レイアウトの追加ビジネスがはるかに簡単になります)。

PyQt4に「スタック」をウィジェットとして認識させるのに問題があります。

Qt Designerでウィジェットスタックを作成し(形式:widgetとして)、
「pyuic4DesignerFile.ui>ClassFile.py」を介して.pyに変換しました。

現在、この「スタック」(3つの子ウィジェットの親ウィジェット)を.addWidget(Class)を介してレイアウトに追加できないようです。

スタッククラスのスーパークラスを作成しようとしましたが(スタックに機能を追加する必要があるため)、クラスのインスタンスは次のいずれかです...

  • ウィジェットとして認識されない
  • 見えない
  • スーパークラスの構成方法がわからないため、欠陥があります。

これが私が現時点で失敗していることです(それは私が試した8番目のクラスの構造についてですが):

from ClassFile import ClassCode

class Stack(ClassCode):
    def __init__(self,parent= None):
        QtGui.QWidget.__init__(self,parent)

誰かが私がこれを構築するのを手伝ってくれるか、または私をいくつかの良い例に導くことができますか?
(私は次の両方のソースのコードを模倣しましたが、役に立ちませんでした!!
http://lateral.netmanagers.com.ar/stories/27.html#what-you-need-to-follow-the-tutorial
http ://zetcode.com/tutorials/pyqt4/customwidgets/

ありがとう!

仕様:
python 2.7.2
PyQt4
Windows 7

4

2 に答える 2

5

デフォルトのオプションを使用してファイルからPythonモジュールをコンパイルするuiと、(とりわけ)単純な「セットアップ」クラスが生成されます。概要として、セットアップクラスは次のようになります。

class Ui_ClassCode(object):
    def setupUi(self, ClassCode):
        ClassCode.setObjectName("ClassCode")
        # bunch of boiler-plate ui code goes here
        self.retranslateUi(ClassCode)
        QtCore.QMetaObject.connectSlotsByName(ClassCode)

    def retranslateUi(self, ClassCode):
        pass

ここで、質問に関連するいくつかの問題に注意する必要があります。

まず、セットアップクラスは、直接のサブクラスとしてではなく、ミックスインとして使用するように設計されています。setupUIタスクは、メソッドに渡されるホストウィジェットにUIを「注入」することです。

objectName次に、セットアップクラスには、Designerで設定されたプロパティの前に「Ui_」を付けることによって作成される醜い非Pythonの識別子が与えられます。

幸い、pyuic4は、これら2つの問題を回避する方法を提供します。必要なのは-w、uiファイルからpythonモジュールをコンパイルするときにオプションを使用することだけです。

pyuic4 -w designerfile.ui > classfile.py

これにより、(1)簡単にサブクラス化できるラッパークラスが追加され、(2)QtDesignerで適切に指定されたクラス名が追加されます

ラッパークラスは次のようになります。

class ClassCode(QtGui.QWidget, Ui_ClassCode):
    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
        QtGui.QWidget.__init__(self, parent, f)

        self.setupUi(self)

ご覧のとおり、特別なことは何もしていません。自分のコードで行うことを簡単に複製できます。しかし、IMOは、コンパイルされたモジュールをはるかに直感的に使用できるようにします。

例えば:

from PyQt4 import QtGui, QtCore
from classfile import ClassCode

class Stack(ClassCode):
    def __init__(self, parent=None):
        ClassCode.__init__(self, parent)

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.stack = Stack(self)
        self.setCentralWidget(self.stack)
于 2011-12-17T19:02:27.817 に答える
1

__init__まず、を使用して親を呼び出す方が適切ですsuper。これにより、適切なスーパークラスのメソッドが確実に呼び出されます。次に、pyuicで構築されたクラスを使用する場合はself.setupUi(self)__init__メソッドから呼び出す必要があります。そして最後に、適切なQtクラスとpyuicで生成されたクラス(実際にはミックスインのようなもの)の両方から多重継承することを確認する必要があります。

だから、このようなもの:

from ClassFile import ClassCode

class Stack(QtGui.QWidget, ClassCode):
    def __init__(self,parent= None):
        super(Stack, self).__init__(parent)
        self.setupUi(self)
于 2011-12-17T17:36:37.353 に答える