【发布时间】:2018-11-27 23:11:26
【问题描述】:
我有两个用 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_())
【问题讨论】: