Python PyQt отправляет данные между формами - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть две формы, созданные с помощью Qt Designer.В двух формах используется процесс uic.loadUiType, описанный здесь .Я загрузил формы пользовательского интерфейса в это местоположение Для импорта форм.Главное окно имеет три кнопки.При нажатии каждой кнопки - при попытке передать, какая кнопка была передана в форму цифровой клавиатуры - при попытке использовать сигналы и слоты, но она не работает.

Когда открывается форма NumPad, мне нужно заполнить ее полями 1, 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_())

1 Ответ

0 голосов
/ 28 ноября 2018

Первым делом необходимо спроектировать классы, в случае 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...