我有两种使用Qt Designer构建的表单。这两种形式利用here中描述的uic.loadUiType过程。我已将UI表单上载到this location以导入表单。主窗口有三个按钮。按下每个按钮时-尝试将哪个按钮传递给数字键盘表单-尝试使用信号和插槽,但不起作用。
当NumPad窗体打开时,我需要使用它填充Field1、2或3,以便我可以将txtDatToPass的内容传递回主窗口窗体。不知道为什么信号并没有通过。任何想法或指导都会有所帮助
谢谢
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QApplication, QLabel
from PyQt5 import uic
qtCreatorFile = "MainWinForm.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
qtCreatorFileKeyPad = "NumPadForm.ui"
Ui_KeyPad, QtBaseClass = uic.loadUiType(qtCreatorFileKeyPad )
class PunchWindow(QtWidgets.QMainWindow):
signalPassDataToMainForm = QtCore.pyqtSignal(str,str)
def __init__(self):
super(PunchWindow, self).__init__()
self.ui = Ui_KeyPad()
self.ui.setupUi(self)
self.move(850, 200) #Center Screen
#NumberPad
self.ui.btnOne.clicked.connect(lambda: self.numberPad(1))
self.ui.btnTwo.clicked.connect(lambda: self.numberPad(2))
self.ui.btnThree.clicked.connect(lambda: self.numberPad(3))
self.ui.btnFour.clicked.connect(lambda: self.numberPad(4))
self.ui.btnFive.clicked.connect(lambda: self.numberPad(5))
self.ui.btnSix.clicked.connect(lambda: self.numberPad(6))
self.ui.btnSeven.clicked.connect(lambda: self.numberPad(7))
self.ui.btnEight.clicked.connect(lambda: self.numberPad(8))
self.ui.btnNine.clicked.connect(lambda: self.numberPad(9))
self.ui.btnZero.clicked.connect(lambda: self.numberPad(0))
self.ui.btnDot.clicked.connect(lambda: self.numberPad("."))
self.ui.btnBackSpace.clicked.connect(lambda: self.numberPad("BS"))
self.ui.btnClear.clicked.connect(lambda: self.numberPad("Clear"))
self.ui.btnEnter.clicked.connect(self.Enter)
##
def numberPad(self, n):
print(n)
strField = self.ui.txtDataField.toPlainText()
if(strField == "Field1") or (strField == "Field2") or (strField == "Field3"):
strValue = self.ui.txtDataToPass.toPlainText()
strN = str(n)
if(strN == "BS"):
strTrim = strValue[:-1]
self.ui.txtDataToPass.setText(strTrim)
elif(strN == "Clear"):
self.ui.txtDataToPass.setText("")
else:
strValue = strValue + strN
self.ui.txtDataToPass.setText(strValue)
def Enter(self):
strFieldNo = self.ui.txtDataField.toPlainText()
strSendData = self.ui.txtDataToPass.toPlainText()
print("Trying to send contents of txtDataToPass back to MainWindow Form -- Data Field: " + strFieldNo + " Data: " + strSendData)
self.signalPassDataToMainForm.emit(strFieldNo, strSendData)
class MainWindow(QtWidgets.QMainWindow):
signalPassData = QtCore.pyqtSignal(str) # used to send Field1, 2 , or 3 to Punch Window
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.move(450, 200) #Center Screen
self.ui.btnField1.clicked.connect(self.Field1)
self.ui.btnField2.clicked.connect(self.Field2)
self.ui.btnField3.clicked.connect(self.Field3)
#Should recieve signals back from PunchWindow
self.Punch = PunchWindow()
self.Punch.signalPassDataToMainForm.connect(self.Update)
def Update(self, strField, strData):
self.ui.txtData1.setText(strData)
def Field1(self):
strField = "Field1"
print(strField)
self.ui.SW = PunchWindow()
self.ui.SW.show()
self.signalPassData.emit(strField)
def Field2(self):
strField = "Field2"
print(strField)
self.ui.SW = PunchWindow()
self.ui.SW.show()
self.signalPassData.emit(strField)
def Field3(self):
strField = "Field3"
print(strField)
self.ui.SW = PunchWindow()
self.ui.SW.show()
self.signalPassData.emit(strField)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MW = MainWindow()
MW.show()
sys.exit(app.exec_())
参考方案
首先是设计类,在PunchWindow的情况下,您必须具有一种方法来更新txtDataField并具有将数据发送到MainWindow的信号。另一方面,在MainWindow中,每次按按钮时,都必须使用最初提到的方法更新txtDataField,然后必须在连接到signalPassDataToMainForm的插槽中区分适当的字段。
import sys
from functools import partial
from PyQt5 import QtCore, QtWidgets, uic
qtCreatorFile = "MainWinForm.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
qtCreatorFileKeyPad = "NumPadForm.ui"
Ui_KeyPad, QtBaseClass = uic.loadUiType(qtCreatorFileKeyPad )
class PunchWindow(QtWidgets.QMainWindow, Ui_KeyPad):
signalPassDataToMainForm = QtCore.pyqtSignal(str, str)
def __init__(self, parent=None):
super(PunchWindow, self).__init__(parent)
self.setupUi(self)
self.move(850, 200) #Center Screen
buttons = (self.btnOne, self.btnTwo, self.btnThree, self.btnFour,
self.btnFive, self.btnSix, self.btnSeven, self.btnEight,
self.btnNine, self.btnZero, self.btnDot, self.btnBackSpace,
self.btnClear)
vals = (1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ".", "BS", "Clear")
for button, val in zip(buttons, vals):
button.clicked.connect(partial(self.numberPad, val))
self.btnEnter.clicked.connect(self.enter)
@QtCore.pyqtSlot(str)
def setCurrentField(self, text):
self.txtDataField.setPlainText(text)
def numberPad(self, n):
strField = self.txtDataField.toPlainText()
if strField in ("Field1", "Field2", "Field3"):
strValue = self.txtDataToPass.toPlainText()
strN = str(n)
if strN == "BS":
self.txtDataToPass.setPlainText(strValue[:-1])
elif strN == "Clear":
self.txtDataToPass.clear()
else:
strValue += strN
self.txtDataToPass.setPlainText(strValue)
@QtCore.pyqtSlot()
def enter(self):
strFieldNo = self.txtDataField.toPlainText()
strSendData = self.txtDataToPass.toPlainText()
self.signalPassDataToMainForm.emit(strFieldNo, strSendData)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.move(450, 200) #Center Screen
buttons = (self.btnField1, self.btnField2, self.btnField3)
fields = ("Field1", "Field2", "Field3")
for button, field in zip(buttons, fields):
button.clicked.connect(partial(self.updatePunch, field))
self.punch = PunchWindow()
self.punch.signalPassDataToMainForm.connect(self.updateField)
@QtCore.pyqtSlot(str, str)
def updateField(self, strField, strData):
if strField == "Field1":
self.txtData1.setText(strData)
elif strField == "Field2":
self.txtData2.setText(strData)
elif strField == "Field3":
self.txtData3.setText(strData)
@QtCore.pyqtSlot()
def updatePunch(self, field):
self.punch.setCurrentField(field)
self.punch.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MW = MainWindow()
MW.show()
sys.exit(app.exec_())
如何使用pass语句? - python我正在学习Python,并且已经到达有关pass语句的部分。我正在使用的指南将其定义为通常用作占位符的Null语句。我仍然不完全明白那是什么意思。有人可以告诉我一个简单的/基本情况,在其中使用pass语句以及为什么需要它吗? 参考方案 假设您正在使用尚未实现的某些方法设计一个新类。class MyClass(object): def meth_a(self)…
Python-crontab模块 - python我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…
Python:检查是否存在维基百科文章 - python我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…
Python __getitem__和in运算符导致奇怪的行为 - python是什么解释了以下行为:class Foo: def __getitem__(self, item): print("?") return 1 f = Foo() 1 in f # prints one ? and returns True 5 in f # prints ? forever until you raise a Keyboa…
Python,从类方法中删除列表项 - python我上课了我想在内部创建一种方法,以通过code属性删除列表项。class MyClass(Base): def __init__(self, code, name): self.__code = code self.__name = name @property def code(self): return self.__code @property def…