PyQt:包装来自 QDesigner 的对话框和连接按钮
PyQt: Wrapping Dialog from QDesigner and Connect pushbutton
我开始学习 Python 和 PyQt。目前,我正在与一个非常基本的问题作斗争,这个问题是关于连接信号和槽的,对话框是从 QDesigner 生成的。
我想从 QDialog 连接一个按钮。该代码不会产生错误。正如预期的那样显示对话框。但是点击按钮没有任何反应。
或者,我尝试将代码形式 Ui_Dialog
直接包含在我的目标 class Testdialog
中。然后连接正常。似乎我在以我想要执行对话框的方式从 Ui_Dialog
继承属性到 Testdialog
and/or 时犯了一个错误。
我的主程序如下所示:
from __future__ import unicode_literals
import sys
from PyQt4 import *
from PyQt4 import QtGui
from PyQt4.QtCore import SIGNAL, QObject
import UI_Test
class Testdialog(QtGui.QDialog, UI_Test.Ui_Dialog):
def __init__(self,parent=None):
super(Testdialog, self).__init__(parent)
self.setupUi(self)
print("Connect buttons") # gives the expected output
self.connect(self.pushButton_Ok, SIGNAL("clicked()"), self.clickedOk)
self.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
# Alternativly I have tríed the following without improvement:
# self.pushButton_Ok.clicked.connect(self.clickedOk)
# QObject.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
def clickedCancel(self):
print ("Cancel") # Question: Why is nothing happening here?
def clickedOk(self):
print ("Ok") # Question: Why is nothing happening here?
if True:
qApp = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
u = Testdialog()
u.setupUi(Dialog)
Dialog.exec_()
sys.exit(qApp.exec_())
当我点击 bushbuttons 时没有任何反应。似乎连接不起作用。
我做错了什么?如何修复它?还有什么需要改进的?
形式UI_Test.py
没什么特别的,因为它是用QtDesigner和pyuic自动生成的。所以基本上应该没问题(虽然我不明白代码的每一个细节)。
为了提供一个正在运行的例子,这里是代码:
# File: UI_Test.py
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(271, 70)
self.pushButton_Ok = QtGui.QPushButton(Dialog)
self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
self.pushButton_Ok.setObjectName(_fromUtf8("pushButton_Ok"))
self.pushButton_Cancel = QtGui.QPushButton(Dialog)
self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
self.pushButton_Cancel.setObjectName(_fromUtf8("pushButton_Cancel"))
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
self.pushButton_Ok.setText(_translate("Dialog", "OK", None))
self.pushButton_Cancel.setText(_translate("Dialog", "Cancel", None))
嘿,这是我的答案。我只是在没有 QtDesigner 的情况下制作了相同的示例(只需复制粘贴并运行它):
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.Qt import pyqtSlot
class MyDialog(QtGui.QDialog):
def __init__(self):
super(MyDialog, self).__init__()
self.resize(271, 70)
self.pushButton_Ok = QtGui.QPushButton(self)
self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
self.pushButton_Ok.setText("Ok")
self.pushButton_Cancel = QtGui.QPushButton(self)
self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
self.pushButton_Cancel.setText("Cancel")
# HERE the slots are connected
self.pushButton_Ok.clicked.connect(self.clickedOk) # new style signal/slot
self.pushButton_Cancel.clicked.connect(self.clickedCancel) # new style signal/slot
@pyqtSlot()
def clickedCancel(self):
print ("Cancel pressed")
@pyqtSlot()
def clickedOk(self):
print ("Ok pressed")
qApp = QtGui.QApplication(sys.argv)
dial = MyDialog()
dial.show()
sys.exit(qApp.exec_())
我希望您现在明白我的意思是不要使用 QtDesigner。因为像这个例子一样,它更清晰,代码更少 and 你更了解后台发生的事情。希望我的回答对你有帮助。
原代码中的问题在这一段:
if True:
qApp = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
u = Testdialog()
u.setupUi(Dialog)
Dialog.exec_()
sys.exit(qApp.exec_())
你想要的是这样的:
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
u = Testdialog()
u.show()
sys.exit(app.exec_())
原来的代码之所以不起作用,是因为信号连接仅在Testdialog
的__init__
中进行。您创建的 Testdialog
实例添加了所有 ui,并且所有信号都正确连接,但您从未真正显示它!相反,您显示您创建的 other 对话框(即 Dialog
),它获得相同 [=27= 的 new 副本] 添加到其中(通过 setupUi
)- 但没有信号连接。
我开始学习 Python 和 PyQt。目前,我正在与一个非常基本的问题作斗争,这个问题是关于连接信号和槽的,对话框是从 QDesigner 生成的。 我想从 QDialog 连接一个按钮。该代码不会产生错误。正如预期的那样显示对话框。但是点击按钮没有任何反应。
或者,我尝试将代码形式 Ui_Dialog
直接包含在我的目标 class Testdialog
中。然后连接正常。似乎我在以我想要执行对话框的方式从 Ui_Dialog
继承属性到 Testdialog
and/or 时犯了一个错误。
我的主程序如下所示:
from __future__ import unicode_literals
import sys
from PyQt4 import *
from PyQt4 import QtGui
from PyQt4.QtCore import SIGNAL, QObject
import UI_Test
class Testdialog(QtGui.QDialog, UI_Test.Ui_Dialog):
def __init__(self,parent=None):
super(Testdialog, self).__init__(parent)
self.setupUi(self)
print("Connect buttons") # gives the expected output
self.connect(self.pushButton_Ok, SIGNAL("clicked()"), self.clickedOk)
self.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
# Alternativly I have tríed the following without improvement:
# self.pushButton_Ok.clicked.connect(self.clickedOk)
# QObject.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)
def clickedCancel(self):
print ("Cancel") # Question: Why is nothing happening here?
def clickedOk(self):
print ("Ok") # Question: Why is nothing happening here?
if True:
qApp = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
u = Testdialog()
u.setupUi(Dialog)
Dialog.exec_()
sys.exit(qApp.exec_())
当我点击 bushbuttons 时没有任何反应。似乎连接不起作用。
我做错了什么?如何修复它?还有什么需要改进的?
形式UI_Test.py
没什么特别的,因为它是用QtDesigner和pyuic自动生成的。所以基本上应该没问题(虽然我不明白代码的每一个细节)。
为了提供一个正在运行的例子,这里是代码:
# File: UI_Test.py
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(271, 70)
self.pushButton_Ok = QtGui.QPushButton(Dialog)
self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
self.pushButton_Ok.setObjectName(_fromUtf8("pushButton_Ok"))
self.pushButton_Cancel = QtGui.QPushButton(Dialog)
self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
self.pushButton_Cancel.setObjectName(_fromUtf8("pushButton_Cancel"))
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
self.pushButton_Ok.setText(_translate("Dialog", "OK", None))
self.pushButton_Cancel.setText(_translate("Dialog", "Cancel", None))
嘿,这是我的答案。我只是在没有 QtDesigner 的情况下制作了相同的示例(只需复制粘贴并运行它):
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.Qt import pyqtSlot
class MyDialog(QtGui.QDialog):
def __init__(self):
super(MyDialog, self).__init__()
self.resize(271, 70)
self.pushButton_Ok = QtGui.QPushButton(self)
self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
self.pushButton_Ok.setText("Ok")
self.pushButton_Cancel = QtGui.QPushButton(self)
self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
self.pushButton_Cancel.setText("Cancel")
# HERE the slots are connected
self.pushButton_Ok.clicked.connect(self.clickedOk) # new style signal/slot
self.pushButton_Cancel.clicked.connect(self.clickedCancel) # new style signal/slot
@pyqtSlot()
def clickedCancel(self):
print ("Cancel pressed")
@pyqtSlot()
def clickedOk(self):
print ("Ok pressed")
qApp = QtGui.QApplication(sys.argv)
dial = MyDialog()
dial.show()
sys.exit(qApp.exec_())
我希望您现在明白我的意思是不要使用 QtDesigner。因为像这个例子一样,它更清晰,代码更少 and 你更了解后台发生的事情。希望我的回答对你有帮助。
原代码中的问题在这一段:
if True:
qApp = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
u = Testdialog()
u.setupUi(Dialog)
Dialog.exec_()
sys.exit(qApp.exec_())
你想要的是这样的:
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
u = Testdialog()
u.show()
sys.exit(app.exec_())
原来的代码之所以不起作用,是因为信号连接仅在Testdialog
的__init__
中进行。您创建的 Testdialog
实例添加了所有 ui,并且所有信号都正确连接,但您从未真正显示它!相反,您显示您创建的 other 对话框(即 Dialog
),它获得相同 [=27= 的 new 副本] 添加到其中(通过 setupUi
)- 但没有信号连接。