QlineEdit以及信号和插槽

时间:2018-09-08 18:26:55

标签: python pyqt pyqt5 signals-slots qlineedit

我用QLineEditQLabel创建了一个小部件,我想从QlineEdit获取输入并用QLabel显示它。我已经使用信号和插槽连接,我不知道我做错了什么,但是不能正常工作。我想从QLineEdit获取两个值,然后再显示。

当前窗口

enter image description here

我想要什么?

enter image description here

代码:

import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class WinDialog(QtWidgets.QDialog):

    currenttextedited = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(WinDialog, self).__init__(parent)

        self.setGeometry(300,300,350,300)

        self.setWindowTitle("Signal & Slot")

        self.propertyWidget = PropertyWidget()

        section_lay = QtWidgets.QHBoxLayout()
        section_label = QtWidgets.QLabel("Name: ")
        section_edit = QtWidgets.QLineEdit('')

        length_lay = QtWidgets.QHBoxLayout()
        length_label = QtWidgets.QLabel("Input a number:     L = ")
        self.length_edit = QtWidgets.QLineEdit('1000')
        self.length_edit.setInputMask("999999")
        self.length_edit.setFocus(True)

        thick_lay = QtWidgets.QHBoxLayout()
        thick_label = QtWidgets.QLabel("Input a text: T = ")
        thick_edit = QtWidgets.QLineEdit('')

        section_lay.addWidget(section_label)
        section_lay.addWidget(section_edit)

        length_lay.addWidget(length_label)
        length_lay.addWidget(self.length_edit)
        length_lay.addStretch()

        thick_lay.addWidget(thick_label)
        thick_lay.addWidget(thick_edit)
        thick_lay.addStretch()

        VB_lay = QtWidgets.QVBoxLayout()
        VB_lay.addStretch()
        VB_lay.addLayout(length_lay)
        VB_lay.addLayout(thick_lay)
        VB_lay.addStretch()

        buttonBox = QtWidgets.QDialogButtonBox()

        buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel
        |QtWidgets.QDialogButtonBox.Ok)
        buttonBox.accepted.connect(self.accept) 
        buttonBox.rejected.connect(self.reject)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(section_lay, 0, 0, 1, 2)
        grid.addLayout(VB_lay, 1, 0)
        grid.addWidget(self.propertyWidget, 2, 0)
        grid.addWidget(buttonBox, 3, 0, 1, 2)



        self.length_edit.textEdited.connect(self.textchanged)

    def textchanged(self, text):
        print(text)
        self.currenttextedited.emit(text)

class PropertyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
       super(PropertyWidget, self).__init__(parent)        
       HB_lay = QtWidgets.QHBoxLayout(self)
       self.Displaylabel = QtWidgets.QLabel('')
       HB_lay.addWidget(self.Displaylabel)
       HB_lay.addStretch()



@QtCore.pyqtSlot(int)
def Display(self, text):
    try:
        L_Display = int(text)
        T_Display = int(text) 
        fmt = "L = {}mm\nT = {}mm"
        self.Displaylabel.setText(fmt.format(L_Display, T_Display))
    except ValueError:
        print("Error")        


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = WinDialog()
    w.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

根据图像中的示例,您想显示不同的文本,但是您要将相同的数字转换为整数:L_Display = int(text)T_Display = int(text),那么您如何期望显示2个不同的文本?函数显示需要2个条目(self中有2个不同的条目,另外,由于建议函数使用小写字母,因此我将其更改为小写)。

现在,逻辑如下:如果length_edit或thin_edit的任何文本更改,则必须调用display()传递新文本。因此解决方案是使用一个插槽,该插槽连接两个textEdited的{​​{1}}信号,并在其中获取文本并传递文本。

最后,我看到您希望QLineEdit仅接收数字,因此一种选择是使用QLineEdit以便仅接受数字(另一种更好的选择是使用QIntValidator QSpinBox

QLineEdit