【问题标题】:QCompleter giving weird bug to lineEdit in pyqt5QCompleter 给 pyqt5 中的 lineEdit 带来奇怪的错误
【发布时间】:2019-07-09 18:51:33
【问题描述】:

我设置了两个 lineEdit,其中一个设置了 QCompleter。当用户选择建议的文本时,两个 lineEdits 都应填写建议的文本。逗号右边的词进入第一行编辑,左边的词进入第二行编辑。目前,只有第二个 lineEdit 获得了它的文本集,但第一个 lineEdit 在再次按 Enter 后才获得它的文本集。 例如,如果用户选择“chikin,pizza”并点击进入第二行编辑应该设置为chikin,第一个设置为pizza。目前,第二行编辑确实说 chikin,但第一个仍然说“chikin,pizza”,直到您再次按 Enter。我怎样才能解决它,以便用户不必按两次回车?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QCompleter


class Ui_MainWindow(object):


    def on_button(self):

        print('Button clicked')

        fullName = self.lineEdit.text()

        nameList = fullName.split(', ')

        firstName = nameList[1]
        lastName = nameList[0]

        self.lineEdit_2.setText(lastName)
        self.lineEdit.setText(firstName)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(439, 254)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(20, 90, 180, 25))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(240, 90, 180, 25))
        self.lineEdit_2.setObjectName("lineEdit_2")


        food = ["pizza, chikin", "chikin, pizza", "chikin, pizza pizza", "chikin, pizza", "fried, pizza"]

        completer = QCompleter(food)
        completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        completer.setFilterMode(QtCore.Qt.MatchContains)

        self.lineEdit.setCompleter(completer)
        self.lineEdit.editingFinished.connect(lambda: self.on_button())

        MainWindow.setCentralWidget(self.centralwidget)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt5


    【解决方案1】:

    试试看:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QCompleter
    
    
    class Ui_MainWindow(object):
    
    #    def on_button(self):
        def on_button(self, text):                                                    # +++
            nameList = text.split(', ')
    
            self.lineEdit_2.setText(nameList[0])
    #        self.lineEdit.setText(nameList[1])
            QtCore.QTimer.singleShot(200, lambda: self.lineEdit.setText(nameList[1]))  # +++
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(439, 254)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
            self.lineEdit.setGeometry(QtCore.QRect(20, 90, 180, 25))
            self.lineEdit.setObjectName("lineEdit")
            self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
            self.lineEdit_2.setGeometry(QtCore.QRect(240, 90, 180, 25))
            self.lineEdit_2.setObjectName("lineEdit_2")
    
            food = ["pizza, chikin", "chikin, pizza", "chikin, pizza pizza", "chikin, pizza", "fried, pizza"]
    
            completer = QCompleter(food)
            completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
            completer.setFilterMode(QtCore.Qt.MatchContains)
            self.lineEdit.setCompleter(completer)
    
    #        self.lineEdit.editingFinished.connect(lambda: self.on_button())
            completer.activated.connect(self.on_button)                                    # +++
    
            MainWindow.setCentralWidget(self.centralwidget)
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 非常感谢!如果我可能会问,单次方法调用的目的是什么?
    • @SheriefEl-Ghazawi 200 毫秒后,将self.lineEdit 中的chikin, pizza 的值更改为pizza
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多