简体   繁体   中英

PyQt5 How to modify multiple QLineEdit?

I need to modify multiple QLineEdit, for example to set default value or to check whether the input is integer. I decided to try with classes so I can organize my code.

from PyQt5 import QtWidgets, QtCore, QtGui
from Ui_Dla_Szefa import UiDlaSzefa


class LineEdit(QtWidgets.QLineEdit):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def set_text(self):
        self.setText("0")


class InputWindow(QtWidgets.QMainWindow, UiDlaSzefa):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.lineEdit_otrzymane1 = LineEdit()
        self.lineEdit_otrzymane1.set_text()

Unfortunately nothing happens. The problem seems to be with transfering input from QLineEdit to lineEdit_otrzymane1. Help Please :) Maybe there is a better way to change multiple lineEdit's in one place?

This seems to make sense if the QLineEdit::objectName of your application has a semantic grouping.

The example below demonstrates replacing the value of a QLineEdit widget if the name of this object contains the string 'otrzymane' :

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class UiDlaSzefa(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1029, 856)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.gridLayout_12 = QtWidgets.QGridLayout(self.centralWidget)
        self.gridLayout_12.setContentsMargins(11, 11, 11, 11)
        self.gridLayout_12.setSpacing(6)
        self.gridLayout_12.setObjectName("gridLayout_12")
        self.tabWidget = QtWidgets.QTabWidget(self.centralWidget)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.widget = QtWidgets.QWidget(self.tab)
        self.widget.setGeometry(QtCore.QRect(0, 0, 241, 131))
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(11, 11, 11, 11)
        self.gridLayout.setHorizontalSpacing(4)
        self.gridLayout.setVerticalSpacing(0)
        self.gridLayout.setObjectName("gridLayout")
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 4, 0, 1, 1)
        self.label_11 = QtWidgets.QLabel(self.widget)
        self.label_11.setObjectName("label_11")
        self.gridLayout.addWidget(self.label_11, 2, 0, 1, 1)
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setMaximumSize(QtCore.QSize(16777215, 20))
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 2)
        self.label_14 = QtWidgets.QLabel(self.widget)
        self.label_14.setObjectName("label_14")
        self.gridLayout.addWidget(self.label_14, 2, 2, 1, 1)
        self.label_24 = QtWidgets.QLabel(self.widget)
        self.label_24.setObjectName("label_24")
        self.gridLayout.addWidget(self.label_24, 1, 2, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.widget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 4, 2, 1, 1)
        self.label_10 = QtWidgets.QLabel(self.widget)
        self.label_10.setObjectName("label_10")
        self.gridLayout.addWidget(self.label_10, 3, 0, 1, 1)
        self.label_13 = QtWidgets.QLabel(self.widget)
        self.label_13.setObjectName("label_13")
        self.gridLayout.addWidget(self.label_13, 3, 2, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 2, 1, 2)
        self.label_12 = QtWidgets.QLabel(self.widget)
        self.label_12.setObjectName("label_12")
        self.gridLayout.addWidget(self.label_12, 1, 0, 1, 1)
        self.lineEdit_otrzymane1 = QtWidgets.QLineEdit(self.widget)

# ...
# ...        

        self.lineEdit_w1_2.setText(_translate("MainWindow", "0"))
        self.lineEdit_i1_2.setText(_translate("MainWindow", "0"))
        self.lineEdit_i5_2.setText(_translate("MainWindow", "0"))
        self.lineEdit_w200_2.setText(_translate("MainWindow", "0"))
        self.lineEdit_i10_2.setText(_translate("MainWindow", "0"))
        self.label_140.setText(_translate("MainWindow", "0,20zł   X"))
        self.lineEdit_w5_2.setText(_translate("MainWindow", "0"))
        self.label_146.setText(_translate("MainWindow", "0,05zł   X"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))

# ---------------------------------------------------------------------------

class InputWindow(QtWidgets.QMainWindow, UiDlaSzefa):
    def __init__(self):
        super().__init__()

        self.setupUi(self)
        self.show()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

        self.lineEdit_X = QtWidgets.QLineEdit()
        self.lineEdit_X.setWindowTitle("Set default value and to check whether the input is integer")
        self.lineEdit_X.setGeometry(700, 100, 270, 50)
        self.lineEdit_X.editingFinished.connect(self.on_editingFinished)
        self.lineEdit_X.show()


    @QtCore.pyqtSlot()
    def on_editingFinished(self):
        try:
            initLineInt = int(self.lineEdit_X.text())
            initLineStr = self.lineEdit_X.text()

            for widget in QtWidgets.qApp.allWidgets():
                if isinstance(widget, QtWidgets.QLineEdit):
                    if 'otrzymane' in widget.objectName():     # 'otrzymane' !!!
                        print(widget.objectName())
                        widget.setText(initLineStr)

        except ValueError:
            pass
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

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

在此处输入图片说明

Previous answer works only in case I want to clear whole spreadsheet. There were multiple solutions like using mask (too many options to cover), using iteration like in previous example, but finally I decided to use QDoubleSpinBox wherever possible. It has built-in mask, there is no problem with formatting input (many countries use "," instead of "."

If not the problem with mask, subclassing would be a nice solution:

import sys
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

#################################################################### 
def main(): 
    app = QApplication(sys.argv) 
    w = MyWindow() 
    w.show() 
    sys.exit(app.exec_()) 

####################################################################
class MyWindow(QWidget): 
    def __init__(self, *args): 
        QWidget.__init__(self, *args)

        # create objects
        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()
        self.la2 = QLabel("\nLook here:")
        self.le2 = QLineEdit()

        # layout
        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        layout.addWidget(self.la2)
        layout.addWidget(self.le2)
        self.setLayout(layout)

        # connections
        self.connect(self.le, SIGNAL("tabPressed"),
                     self.update)

    def update(self):
        newtext = str(self.le2.text()) + "tab pressed "
        self.le2.setText(newtext)

####################################################################
class MyLineEdit(QLineEdit):
    def __init__(self, *args):
        QLineEdit.__init__(self, *args)

    def event(self, event):
        if (event.type()==QEvent.KeyPress) and (event.key()==Qt.Key_Tab):
            self.emit(SIGNAL("tabPressed"))
            return True

        return QLineEdit.event(self, event)

####################################################################
if __name__ == "__main__": 
    main()

https://www.saltycrane.com/blog/2008/01/how-to-capture-tab-key-press-event-with/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM