2016-11-06 4 views
2

Ich habe eine PyQt-Schnittstelle erstellt, und jetzt möchte ich einige der aktiven/inaktiven Zustand seiner Widgets ändern oder interagieren mit ihnen von außerhalb der Widget-Klasse. Ich habe die Hauptfenster-Klasse mit all ihren Widgets und Funktionen außerhalb der Klasse - hier verbunden mit buttton1. Mein Ziel in diesem Beispiel ist es button2 durch Drücken von button1 zu aktivieren.PyQt: Zugriff auf enabled-state von außerhalb der Widget-Klasse

Mit dem Code unten, bekomme ich den Fehler, dass meine Ui_MainWindow Klasse nicht das Attribut button1 hat.

Der Code:

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_()) 

Bis weiß, dass ich mit Klassen vermieden, denn ehrlich gesagt, sind sie mir sehr abstrakt. Ich schätze, deshalb versage ich hier. Ich schätze, ich greife falsch auf die Widget-Klasse zu.

Ich wäre dankbar, wenn mir jemand in die richtige Richtung zeigen könnte. Ich habe alle Antworten auf ähnliche Probleme gelesen - aber es hat mir nicht geholfen, zu einer Lösung zu kommen.

Antwort

1

Ich nehme an, dass Sie das UI für Ihr Beispiel in Qt Designer entworfen und mit pyuic4 in ein Python-Modul konvertiert haben. Was Sie tun müssen, ist dieses Modul in Ihr Hauptskript zu importieren und dann eine MainWindow Klasse zu erstellen, die das UI lädt. Wenn Sie es richtig machen, werden alle Widgets von Qt Designer als Attribute dieser Klasse enden. Sie können der Klasse dann Methoden hinzufügen, die die Interaktion mit den Widgets steuern.

Zunächst, Wieder erzeugen Ihr ui-Modul und speichern Sie es als mainwindow_ui.py:

pyuic4 -o mainwindow_ui.py mainwindow.ui 

Dann ein Haupt Skript wie folgt erstellen:

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_()) 

Hoffentlich dieser Code ist einfach genug, dass es ist selbsterklärend. Wenn Sie jedoch einige Freilos Tutorials wollen, würde ich empfehlen Sie dies versuchen:

PS: hier ist die mainwindow.ui Datei:

<?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

Dank für Ihre Anweisung. Ihr Beispiel beschreibt jedoch den Verweis von einer Funktion innerhalb der MainWindow-Klasse. Wie würdest du es von einer Funktion außerhalb der Klasse machen? – Esmi

+0

@Esmi. Sie haben darum gebeten, in die richtige Richtung zu zeigen, und das bedeutet, dass Sie Methoden anstelle von externen Funktionen verwenden. Wenn Sie versuchen, Letzteres zu tun, kann das Schreiben von gutem GUI-Code ziemlich schwierig werden. Hast du einen bestimmten Grund, dass du so etwas machen willst? Welches Problem versuchen Sie zu lösen? – ekhumoro

Verwandte Themen