使用多个类在PyQt中为按钮分配命令

0 投票
1 回答
1035 浏览
提问于 2025-04-17 04:52

我刚开始学习Python和PyQt,遇到了一些问题,就是在有多个类的时候,有些按钮的功能无法正常工作。比如,在我的代码中有这样的内容:

class main(QDialog):
    def __init__(self, parent=None, *args):
        QDialog.__init__(self, parent, *args)
        self.setupUi(self)

    def setupUi(self, Dialog):
        Dialog.resize(610, 570)
        Dialog.setWindowTitle(QtGui.QApplication.translate("testing", 
             "testing", None, QtGui.QApplication.UnicodeUTF8))

        self.stackedWidget = QtGui.QStackedWidget(Dialog)
        self.stackedWidget.setGeometry(QtCore.QRect(0, 120, 711, 450))

        for i in range(1, 3):
            self.__dict__['page%d' % i] = QtGui.QWidget()  
            self.stackedWidget.addWidget(self.__dict__['page%d' % i] )  

        self.Ui_Customer = Ui_Customer(Dialog, self.page1)
#        QtCore.QObject.connect(self.Ui_Customer.pushButton_2, 
#            QtCore.SIGNAL("clicked()"), self.clearalltextboxes)

#        def clearalltextboxes(self):
#            for i in range(1, 13):
#                self.Ui_Customer.__dict__['textEdit_%d' % i].clear()

        self.stackedWidget.setCurrentIndex(0)

class Ui_Customer(main):
    def __init__(self, Dialog, page):
        for i in range(1, 3):
            self.__dict__['text_%d' % i] = QtGui.QTextEdit(page)

        self.text_1.setGeometry(QtCore.QRect(10, 10, 81, 21))
        self.text_2.setGeometry(QtCore.QRect(240, 10, 81, 21))

        self.pushButton_2 = QtGui.QPushButton(page)
        self.pushButton_2.setGeometry(QtCore.QRect(130, 160, 101, 23))
        self.pushButton_2.setText("Reset")
        QtCore.QObject.connect(self.pushButton_2, 
            QtCore.SIGNAL("clicked()"), self.clearalltextboxes)

    def clearalltextboxes(self):
        for i in range(1, 3):
            self.Ui_Customer.__dict__['textEdit_%d' % i].clear()


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    myapp = main() 
    myapp.show() 
    sys.exit(app.exec_()) 

问题是,当我按下“重置”按钮(pushbutton_2)时,什么都没有发生(甚至没有出现任何错误提示)。如果我把代码中注释掉的部分去掉,按钮就能正常工作。但我希望能把按钮的操作命令保留在Ui_Customer类里面。有没有办法做到这一点呢?
我最终会有几个类,它们会使用QtCore.QObject.connect这个选项来给按钮分配操作。现在我只是遇到第一个按钮无法正常工作的问题,而不想把它加到main()类里。

1 个回答

0

按钮不工作的原因是因为 Ui_Customer 被设置成了 main 的子类(为什么会这样呢?),而且没有正确初始化。如果把基类改成 object,信号处理器就能正常工作了——不过会因为字典查找时的拼写错误而产生一个 AttributeError(我想你是想写 'text_%d')。

与其逐个评论你代码中的问题,我给你一个总体的建议:使用 Qt Designer 来创建你的用户界面,把所有的程序逻辑放在单独的模块里。这样学习 PyQt 会简单很多,而且对将来也是个好习惯。

撰写回答