2016-11-06 3 views
2

Я построил интерфейс PyQt, и теперь я хочу переключить активное/неактивное состояние своих виджетов или взаимодействовать с ними из-за пределов класса виджета. У меня есть класс главного окна со всеми его виджетами и функциями вне класса - здесь подключен к buttton1. Моя цель в этом примере - включить button2, нажав button1.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

Я предполагаю, что вы разработали ui для своего примера в Qt Designer и преобразовали его в модуль python с помощью pyuic4. Что вам нужно сделать, это импортировать этот модуль в свой основной скрипт, а затем создать класс MainWindow, который загружает ui. Если вы все сделаете правильно, все виджеты из Qt Designer станут атрибутами этого класса. Затем вы можете добавлять методы к классу, которые контролируют взаимодействие с виджетами.

Начнем с того, повторно сгенерировать модуль пользовательского интерфейса и сохранить его как mainwindow_ui.py:

pyuic4 -o mainwindow_ui.py mainwindow.ui 

Затем создать основной сценарий, как это:

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: вот mainwindow.ui файл:

<?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. как бы вы сделали это из функции вне класса? – Esmi

+0

@Esmi. Вы просили указывать в правильном направлении, а это означает использование методов, а не внешних функций. Если вы попытаетесь сделать последнее, писать хороший код gui может довольно сложно. У вас есть конкретная причина для желания сделать что-то таким образом? Какую проблему ты пытаешься решить? – ekhumoro