2013-12-22 5 views
1

Я создал интерфейс в Qt как .ui-файл, а затем преобразовал его в файл python. Затем я хотел добавить некоторые функциональные возможности для таких компонентов, как переключатель и т. Д. Для этого я попытался повторно реализовать класс из Qt и добавить мои события. Но это дает следующее сообщение об ошибке:Как перекомпилировать Ui_MainWindow, сгенерированный Qt

self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
NameError: name 'self' is not defined 

Мой первый вопрос, является ли правильный/правильный способ иметь дело с классами, порожденных Qt? И, во-вторых, почему я получаю ошибку?

Мой код здесь:

import sys 
from PySide import QtCore, QtGui 
from InterfaceClass_Test01 import Ui_MainWindow 

class MainInterface(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainInterface, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

    def setupUi(self, MainWindow): 
     super(MainInterface, self).setupUi(parent, MainWindow) 

     self.radioButton.toggled.connect(self.radioButtonClicked) 
     self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
     self.radioButton_3.toggled.connect(self.radioButton3Clicked) 

    def radioButton3Clicked(self, enabled): 
     pass 

    def radioButton2Clicked(self, enabled): 
     pass 

    def radioButtonClicked(self, enabled): 
     pass 

ответ

1

Создаваемые файлы немного неинтуитивными. Класс UI - просто простая оболочка и не является подклассом вашего виджета верхнего уровня от Qt Designer (как и следовало ожидать).

Вместо этого класс UI имеет метод setupUi, который принимает экземпляр вашего класса верхнего уровня. Этот метод добавит все виджеты из Qt Designer и сделает их атрибутами прошедшего в экземпляре (который обычно будет self). Имена атрибутов берутся из свойства objectName в Qt Designer. Это хорошая идея, чтобы сбросить имена по умолчанию, заданные Qt, на более читаемые, чтобы их было легко ссылаться позже. (И не забудьте повторно создать модуль пользовательского интерфейса после того, как вы сделали изменения!)

модуль, который импортирует интерфейс должен в конечном итоге выглядит так:

import sys 
from PySide import QtCore, QtGui 
from InterfaceClass_Test01 import Ui_MainWindow 

class MainInterface(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainInterface, self).__init__(parent) 
     # inherited from Ui_MainWindow 
     self.setupUi(self) 
     self.radioButton.toggled.connect(self.radioButtonClicked) 
     self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
     self.radioButton_3.toggled.connect(self.radioButton3Clicked) 

    def radioButton3Clicked(self, enabled): 
     pass 

    def radioButton2Clicked(self, enabled): 
     pass 

    def radioButtonClicked(self, enabled): 
     pass 
+0

спасибо! Да, это решило проблему! Вопрос: класс MainInterface имеет 2 аргумента, а это значит, что у него есть 2 родителя! Итак, как я могу узнать, какой __init__ вызывается, когда я запускаю его с помощью метода Super? –

+1

Класс 'MainInterface' не имеет двух родителей: он наследует от двух базовых классов. Вызов [super] (http://docs.python.org/2/library/functions.html#super) гарантирует, что '__init__' всех базовых классов (и _their_ базовых классов и т. Д.) Вызывается в правильный порядок. – ekhumoro

Смежные вопросы