QCompleter给pyqt5中的lineEdit提供了奇怪的bug

2024-05-14 02:52:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个lineEdits设置,其中一个有QCompleter设置。当用户选择建议的文本时,两个行编辑都应该用建议的文本填充。逗号右边的单词进入第一行编辑,左边的单词进入第二行编辑。目前,只有第二个lineEdit获取其文本集,而第一个lineEdit仅在再次按enter键后获取其文本集。 例如,如果用户选择“chikin,pizza”并点击输入,则第二行编辑应设置为chikin,第一行编辑应设置为pizza。目前,第二个lineedit会显示chikin,但是第一个仍然会显示“chikin,pizza”,直到您再次按enter键。如何修复它,以便用户不必按两次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_())

Tags: 用户文本self编辑enterpizzaqtcoreqtwidgets
1条回答
网友
1楼 · 发布于 2024-05-14 02:52:14

试试看:

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_())

enter image description here

相关问题 更多 >