Reputation: 197
I have two lineEdits set up where one of them has a QCompleter setup to it. When a user selects the suggested text, both lineEdits should be filled in with the suggested text. The word to the right of the comma goes into the first lineedit and the word to the left goes into the second lineEdit. At the moment, only the second lineEdit gets its text set, but the first one only gets its text set after hitting enter again. For example, if a user selects "chikin, pizza" and hits enter the second lineEdit should be set to chikin and the first one set to pizza. Currently, the second lineedit does say chikin, but the first one still says "chikin, pizza" until you hit enter again. How can i fix it so that the user doesn't have to hit enter twice?
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_())
Upvotes: 0
Views: 85
Reputation: 13651
Try it:
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_())
Upvotes: 1