Python PyQt在表单之间发送数据 - python

我有两种使用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…