pyqt4按钮点击处理函数

1 投票
3 回答
6280 浏览
提问于 2025-04-16 18:31

我在使用pyqt4的时候遇到了一个问题:这是我正在使用的代码。问题是,当我在点击pushOk按钮的事件处理函数中调用chiedi_numeri()时,它没有显示任何窗口;而如果我直接调用chiedi_numeri(),它又提示说QObjectConnect的第三个参数类型不正确。我该怎么解决这个问题呢?谢谢!

class Ui_dialog(object):
    def setupUi(self, dialog):
        dialog.setObjectName("dialog")
        dialog.resize(400, 300)
        self.pushOk = QtGui.QPushButton(dialog)
        self.pushOk.setGeometry(QtCore.QRect(200, 150, 75, 23))
        self.pushOk.setObjectName("pushOk")
        self.radioButton = QtGui.QRadioButton(dialog)
        self.radioButton.setEnabled(True)
        self.radioButton.setGeometry(QtCore.QRect(60, 40, 261, 18))
        self.radioButton.setChecked(True)
        self.radioButton.setObjectName("radioButton")
        self.radioButton_2 = QtGui.QRadioButton(dialog)
        self.radioButton_2.setGeometry(QtCore.QRect(60, 70, 281, 18))
        self.radioButton_2.setObjectName("radioButton_2")
        self.radioButton_3 = QtGui.QRadioButton(dialog)
        self.radioButton_3.setGeometry(QtCore.QRect(60, 100, 281, 18))
        self.radioButton_3.setObjectName("radioButton_3")
        self.labelRisultato = QtGui.QLabel(dialog)
        self.labelRisultato.setGeometry(QtCore.QRect(70, 200, 261, 51))
        self.labelRisultato.setObjectName("labelRisultato")

        self.retranslateUi(dialog)
        QtCore.QMetaObject.connectSlotsByName(dialog)


    def retranslateUi(self, dialog):
        dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
        self.pushOk.setText(QtGui.QApplication.translate("dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton_2.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci in un intervallo", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton_3.setText(QtGui.QApplication.translate("dialog", "Calcola l\'ennesimo elemento della serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))

def fibonacci():  
    a , b = 0, 1  
    while 1:  
        a, b = b, a + b  
        yield a

def chiedi_numeri(): 
    try:
            max_ = int(raw_input("Inserisci un numero: "))
            if max_ <= 0 :
                print "Il numero", max_, "non e' positivo!"
            else:
                start = 0  
                for i in fibonacci():  
                        if start > max_:
                            break
                        else:
                            start += 1
                            if start == max_:
                                    print  "Il", max_, "numero della sequenza di Fibonacci e'", i
    except ValueError:
            print "Non hai inserito un numero!"


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    dialog = QtGui.QDialog()
    ui = Ui_dialog()
    ui.setupUi(dialog)
    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri())
    dialog.show()
    sys.exit(app.exec_())

3 个回答

0

从PyQt4库中引入一些基本的模块和类,这些模块和类可以帮助我们创建图形界面。

我们尝试定义一个函数,用来处理字符串的编码。如果出现错误,就用一个简单的方式来处理字符串。

接下来,我们定义了一个叫做Ui_Dialog的类,这个类里面有一个设置界面的方法。这个方法会设置对话框的名字和大小,并在对话框中放置一个按钮。

    self.radioButton = QtGui.QRadioButton(dialog)
    self.radioButton.setEnabled(True)
    self.radioButton.setGeometry(QtCore.QRect(60, 40, 261, 18))
    self.radioButton.setChecked(True)
    self.radioButton.setObjectName("radioButton")
    self.radioButton_2 = QtGui.QRadioButton(dialog)
    self.radioButton_2.setGeometry(QtCore.QRect(60, 70, 281, 18))
    self.radioButton_2.setObjectName("radioButton_2")
    self.radioButton_3 = QtGui.QRadioButton(dialog)
    self.radioButton_3.setGeometry(QtCore.QRect(60, 100, 281, 18))
    self.radioButton_3.setObjectName("radioButton_3")
    self.labelRisultato = QtGui.QLabel(dialog)
    self.labelRisultato.setGeometry(QtCore.QRect(70, 200, 261, 51))
    self.labelRisultato.setObjectName("labelRisultato")

    self.lineEdit = QtGui.QLineEdit(dialog)
    self.lineEdit.setGeometry(QtCore.QRect(240, 39, 150, 18))
    self.lineEdit.setStyleSheet(_fromUtf8("background-color: rgb(255, 255, 248);"))
    self.lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
    self.lineEdit.setObjectName(_fromUtf8("lineEdit"))

    self.textEdit = QtGui.QTextEdit(dialog)
    self.textEdit.setGeometry(QtCore.QRect(10, 220, 250, 150))
    self.textEdit.setStyleSheet(_fromUtf8("background-color: rgb(220, 220, 220);font: 17pt \"Adobe Courier\";"))
    self.textEdit.setObjectName(_fromUtf8("textEdit"))



    self.retranslateUi(dialog)
    QtCore.QMetaObject.connectSlotsByName(dialog)


def retranslateUi(self, dialog):
    dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
    self.pushOk.setText(QtGui.QApplication.translate("dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton_2.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci in un intervallo", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton_3.setText(QtGui.QApplication.translate("dialog", "Calcola l\'ennesimo elemento della serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))

然后,我们定义了一个名为StaxQT4的类,它是一个对话框的子类。在这个类中,我们会有一个初始化的方法。

    QtGui.QDialog.__init__(self)
    self.ui = Ui_Dialog()
    self.ui.setupUi(self)
    self.connect(self.ui.pushOk, QtCore.SIGNAL("clicked()"), self.chiedi_numeri)

我们还定义了一个计算斐波那契数列的函数。在这个函数里,我们从0和1开始,不断生成下一个数,直到我们决定停止。

接着,我们定义了一个请求数字的函数。在这个函数中,我们尝试从输入框中获取一个数字。如果这个数字小于等于0,就会在输入框中显示一个错误信息。如果数字是正数,我们会从0开始,计算斐波那契数列,直到达到用户输入的数字为止。如果输入的不是数字,就会在输入框中显示另一个错误信息。

最后,如果这个文件是直接运行的,就会导入系统模块,并创建一个应用程序的实例。

myapp = StaxQT4()
myapp.show()

sys.exit(app.exec_())
0

你在这一行代码上犯了一个错误:

    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri())

你希望这个函数在按钮被点击时运行,而不是在连接建立时运行。要做到这一点,去掉chiedi_numeri后面的括号:

    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri)

这样就能正确地把按钮和功能连接起来了。

不过,我不太明白你下面说的意思:

我调用了chiedi_numeri(),但没有显示任何表单

你说的“表单”是什么意思?你是期待有一个新窗口弹出来让你输入数字吗?现在,你的程序是在你启动应用程序的终端/命令行/控制台窗口中询问你输入数字。

1

当你把一个信号连接到一个Python函数时,你需要传递这个函数的对象。换句话说,你要省略掉后面的括号,因为你是传递这个函数,而不是在调用它。试着把那一行改成 app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri)

撰写回答