2016-11-06 19 views
2

私はPyQtインタフェースを構築しましたが、ウィジェットのアクティブ/非アクティブ状態の一部を切り替えたり、ウィジェットクラスの外部からそれらとやり取りしたりしたいと思います。 私はすべてのウィジェットを持つメインウィンドウクラスを持ち、クラス外の関数 - ここではbuttton1に接続しています。この例の私の目標は、button1を押してbutton2を有効にすることです。PyQt:ウィジェットクラスの外部から有効な状態にアクセス

以下のコードでは、私のUi_MainWindowクラスに属性button1がないというエラーが表示されます。

コード:

from PyQt4 import QtCore, QtGui 

def toggle(): 
    Ui_MainWindow.button2.setEnabled(True) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     self.button1 = QtGui.QPushButton(self.centralwidget) 
     self.button1.clicked.connect(toggle) 
     self.button2 = QtGui.QPushButton(self.centralwidget) 
     self.button2.setEnabled(False) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow)  

if __name__ == "__main__": 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

正直、彼らは私にとって非常に抽象的であるので、私は、クラスを使用して避けてきた知るまでは。私はそれが私がここで失敗する理由だと思う。私は間違った方法でウィジェットクラスにアクセスしていると思います。

誰かが私を正しい方向に向けることができれば、感謝します。私は同様の問題に対するすべての答えを読んだが、それは私が解決に向かうのを助けなかった。

答えて

1

Qtデザイナであなたの例のUIを設計し、pyuic4を使ってPythonモジュールに変換したとします。必要なのは、このモジュールをメインスクリプトにインポートしてから、uiをロードするMainWindowクラスを作成することです。正しいとすれば、Qt Designerのすべてのウィジェットはこのクラスの属性として終了します。その後、ウィジェットとのやりとりを制御するメソッドをクラスに追加できます。

pyuic4 -o mainwindow_ui.py mainwindow.ui 

次に、このようなメインスクリプトを作成します:あなたのUIモジュールを再生成し、mainwindow_ui.pyとして保存し、そもそも

from PyQt4 import QtCore, QtGui 
from mainwindow_ui import Ui_MainWindow 

class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setupUi(self) 
     self.button1.clicked.connect(self.toggle) 
     self.button2.setEnabled(False) 

    def toggle(self): 
     self.button2.setEnabled(not self.button2.isEnabled()) 

if __name__ == "__main__": 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

うまくいけば、このコードはその十分に簡単です自明です。しかし、あなたには、いくつかのウォークスルーのチュートリアルをしたい場合、私はあなたがこの試みる推薦する:

PSを:あなたの命令の

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>279</width> 
    <height>90</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralwidget"> 
    <layout class="QHBoxLayout" name="horizontalLayout"> 
    <item> 
    <widget class="QPushButton" name="button1"> 
     <property name="text"> 
     <string>Button 1</string> 
     </property> 
    </widget> 
    </item> 
    <item> 
    <widget class="QPushButton" name="button2"> 
     <property name="text"> 
     <string>Button 2</string> 
     </property> 
    </widget> 
    </item> 
    </layout> 
    </widget> 
    <widget class="QMenuBar" name="menubar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>279</width> 
    <height>22</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QStatusBar" name="statusbar"/> 
</widget> 
<resources/> 
<connections/> 
</ui> 
+0

感謝:ここmainwindow.uiファイルです。あなたの例では、MainWindowクラス内の関数からの参照を説明しています。クラス外の関数からどうやってやるの? – Esmi

+0

@エスミ。あなたは正しい方向を指すように求めました。それは、外部関数ではなくメソッドを使用することを意味します。あなたが後者をしようとすると、良いGUIコードを書くことはかなり困難になる可能性があります。あなたはそのようなことをしたいと思う特別な理由はありますか?どのような問題を解決しようとしていますか? – ekhumoro

関連する問題