如何重新实现Qt生成的Ui_MainWindow

时间:2013-12-22 00:51:00

标签: python qt class pyside

我在Qt中创建了一个.ui文件的接口,然后将其转换为python文件。然后,我想为组件添加一些功能,例如单选按钮等。为此,我尝试从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 个答案:

答案 0 :(得分:1)

生成的文件有点不直观。 UI类只是一个简单的包装器,并不是Qt Designer中顶级窗口小部件的子类(正如您所料)。

相反,UI类有一个setupUi方法,它接受顶级类的实例。此方法将添加Qt Designer中的所有小部件,并使它们成为传入实例的属性(通常为self)。属性名称取自Qt Designer中的objectName属性。将Qt给出的默认名称重置为更易读的名称是个好主意,以便以后可以轻松引用它们。 (并且在完成更改后不要忘记重新生成UI模块!)

导入UI的模块最终应如下所示:

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