簡體   English   中英

PyQt:插槽被調用多次

[英]PyQt: slot is called many times

我使用 Qt Designer 創建了一個自定義小部件。 使用pyuic,我將.ui文件轉換為.py文件。 我的意圖很簡單:我需要找出選擇了哪個單選按鈕。

這是 Designer 轉換后的 python 腳本ui_persistence_size.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'persistance_size2.ui'
#
# Created: Fri Dec 19 00:57:01 2014
#      by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(449, 129)
        self.gridLayout_2 = QtGui.QGridLayout(Dialog)
        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.groupBox = QtGui.QGroupBox(Dialog)
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.size_256 = QtGui.QRadioButton(self.groupBox)
        self.size_256.setGeometry(QtCore.QRect(0, 30, 81, 22))
        self.size_256.setObjectName(_fromUtf8("size_256"))
        self.size_512 = QtGui.QRadioButton(self.groupBox)
        self.size_512.setGeometry(QtCore.QRect(90, 30, 81, 22))
        self.size_512.setObjectName(_fromUtf8("size_512"))
        self.size_768 = QtGui.QRadioButton(self.groupBox)
        self.size_768.setGeometry(QtCore.QRect(179, 30, 81, 22))
        self.size_768.setObjectName(_fromUtf8("size_768"))
        self.size_1gb = QtGui.QRadioButton(self.groupBox)
        self.size_1gb.setGeometry(QtCore.QRect(262, 30, 81, 22))
        self.size_1gb.setObjectName(_fromUtf8("size_1gb"))
        self.size_2gb = QtGui.QRadioButton(self.groupBox)
        self.size_2gb.setGeometry(QtCore.QRect(352, 30, 81, 22))
        self.size_2gb.setObjectName(_fromUtf8("size_2gb"))
        self.size_3gb = QtGui.QRadioButton(self.groupBox)
        self.size_3gb.setGeometry(QtCore.QRect(0, 70, 81, 22))
        self.size_3gb.setObjectName(_fromUtf8("size_3gb"))
        self.size_4gb = QtGui.QRadioButton(self.groupBox)
        self.size_4gb.setGeometry(QtCore.QRect(90, 70, 81, 22))
        self.size_4gb.setObjectName(_fromUtf8("size_4gb"))
        self.choose = QtGui.QPushButton(self.groupBox)
        self.choose.setGeometry(QtCore.QRect(310, 68, 96, 26))
        self.choose.setObjectName(_fromUtf8("choose"))
        self.cancel = QtGui.QPushButton(self.groupBox)
        self.cancel.setGeometry(QtCore.QRect(200, 68, 96, 26))
        self.cancel.setObjectName(_fromUtf8("cancel"))
        self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

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

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Persistence Size Chooser...", None))
        self.groupBox.setTitle(_translate("Dialog", "Choose Persistence Size..", None))
        self.size_256.setText(_translate("Dialog", "256MB", None))
        self.size_512.setText(_translate("Dialog", "512MB", None))
        self.size_768.setText(_translate("Dialog", "768GB", None))
        self.size_1gb.setText(_translate("Dialog", "1GB", None))
        self.size_2gb.setText(_translate("Dialog", "2GB", None))
        self.size_3gb.setText(_translate("Dialog", "3GB", None))
        self.size_4gb.setText(_translate("Dialog", "4GB", None))
        self.choose.setToolTip(_translate("Dialog", "<html><head/><body><p>Choose selected persistance size...</p></body></html>", None))
        self.choose.setText(_translate("Dialog", "Choose", None))
        self.cancel.setToolTip(_translate("Dialog", "<html><head/><body><p>Do not choose anything and close the window.</p></body></html>", None))
        self.cancel.setText(_translate("Dialog", "Cancel", None))

這是我正在處理的主要腳本persistence.py

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

from PyQt4 import QtGui
from ui_persistence_size import Ui_Dialog
import sys
import var

class PersistenceGui(QtGui.QDialog, Ui_Dialog):

    #def __init__(self):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.cancel.clicked.connect(self.on_close_clicked)
        self.ui.choose.clicked.connect(self.on_choose_clicked)

    def on_close_clicked(self):
        print "No persistence size choosen."
        QtGui.qApp.closeAllWindows()

    def on_choose_clicked(self):
        if self.ui.size_256.isChecked():
            var.persistence_size = "256"
        elif self.ui.size_512.isChecked():
            var.persistence_size = "512"
        elif self.ui.size_768.isChecked():
            var.persistence_size = "768"
        elif self.ui.size_1gb.isChecked():
            var.persistence_size = "1gb"
        elif self.ui.size_2gb.isChecked():
            var.persistence_size = "2gb"
        elif self.ui.size_3gb.isChecked():
            var.persistence_size = "3gb"
        elif self.ui.size_4gb.isChecked():
            var.persistence_size = "4gb"
            print "Selected" + var.persistence_size
            QtGui.qApp.closeAllWindows()
        else:

            print "Please choose persistence size..."
            QtGui.QMessageBox.information(self, 'No size...', 'No persistence size selected.\n\nPlease choose persistence size and click Choose.')



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

當我執行主腳本時,我發現了兩個問題。 一是除了一個單選按鈕(256MB - 3GB)外,沒有任何作用; 當我選擇最后一個單選按鈕 (4GB) 時,代碼重復了三次。

$ ./persistence.py
Selected4gb
Selected4gb
Selected4gb

之所以將輸出打印三遍,是因為您命名了信號處理程序。 按名稱連接插槽功能將自動連接使用以下格式命名的信號處理程序:

    on_[object name]_[signal name]

由於clicked信號有兩個過載,並且您自己添加了顯式連接,所以總共建立了三個連接。

解決此問題的最簡單方法是將處理程序的名稱更改為如下所示:

        self.ui.cancel.clicked.connect(self.handleCloseClicked)
        self.ui.choose.clicked.connect(self.handleChooseClicked)

    def handleCloseClicked(self):
    ...

    def handleChooseClicked(self):
    ...

另一個問題是由於對if/elif塊的不正確處理引起的。 它可能看起來應該像這樣:

        ...
        elif self.ui.size_4gb.isChecked():
            var.persistence_size = "4gb"
        else:
            print "Please choose persistence size..."
            QtGui.QMessageBox.information(self, 'No size...', 'No persistence size selected.\n\nPlease choose persistence size and click Choose.')
            return
        print "Selected", var.persistence_size
        QtGui.qApp.closeAllWindows()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM