pyqt5 autocomplete QLineEdit - Google places autocomplete

前端 未结 2 803
北海茫月
北海茫月 2021-01-16 11:46

I am trying to create something like this (autocomplete places) in pyqt5 QLineEdit.

There is a class called QCompleter with which i can suggest the

相关标签:
2条回答
  • 2021-01-16 12:04

    For this case you can create a custom model that makes a request using Place Autocomplete, and set that model to a QCompleter:

    import json
    from PyQt5 import QtCore, QtGui, QtWidgets, QtNetwork
    
    API_KEY = "<API_KEY>"
    
    class SuggestionPlaceModel(QtGui.QStandardItemModel):
        finished = QtCore.pyqtSignal()
        error = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(SuggestionPlaceModel, self).__init__(parent)
            self._manager = QtNetwork.QNetworkAccessManager(self)
            self._reply = None
    
        @QtCore.pyqtSlot(str)
        def search(self, text):
            self.clear()
            if self._reply is not None:
                self._reply.abort()
            if text:
                r = self.create_request(text)
                self._reply = self._manager.get(r)
                self._reply.finished.connect(self.on_finished)
            loop = QtCore.QEventLoop()
            self.finished.connect(loop.quit)
            loop.exec_()
    
        def create_request(self, text):
            url = QtCore.QUrl("https://maps.googleapis.com/maps/api/place/autocomplete/json")
            query = QtCore.QUrlQuery()
            query.addQueryItem("key", API_KEY)
            query.addQueryItem("input", text)
            query.addQueryItem("types", "geocode")
            query.addQueryItem("language", "en")
            url.setQuery(query)
            request = QtNetwork.QNetworkRequest(url)
            return request
    
        @QtCore.pyqtSlot()
        def on_finished(self):
            reply = self.sender()
            if reply.error() == QtNetwork.QNetworkReply.NoError:
                data = json.loads(reply.readAll().data())
                if data['status'] == 'OK':
                    for prediction in data['predictions']:
                        self.appendRow(QtGui.QStandardItem(prediction['description']))
                self.error.emit(data['status'])
            self.finished.emit()
            reply.deleteLater()
            self._reply = None
    
    class Completer(QtWidgets.QCompleter):
        def splitPath(self, path):
            self.model().search(path)
            return super(Completer, self).splitPath(path)
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            self._model = SuggestionPlaceModel(self)
            completer = Completer(self, caseSensitivity=QtCore.Qt.CaseInsensitive)
            completer.setModel(self._model)
            lineedit = QtWidgets.QLineEdit()
            lineedit.setCompleter(completer)
            label = QtWidgets.QLabel()
            self._model.error.connect(label.setText)
            lay = QtWidgets.QFormLayout(self)
            lay.addRow("Location: ", lineedit)
            lay.addRow("Error: ", label)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.resize(400, w.sizeHint().height())
        w.show()
        sys.exit(app.exec_())
    

    0 讨论(0)
  • 2021-01-16 12:16

    I faced the same issue, at first I tried @eyllanasec's answer. But for some reason, the performance is not so good (often stuck or hang) in the platform that I use (I was creating a plugin for Qt-based software using PyQt). It is running fine independently though, so perhaps it's specific to my platform.

    In the end, I found a Qt example project for a similar case, Google Suggest. You can find it https://doc.qt.io/qt-5/qtnetwork-googlesuggest-example.html. It creates a custom class to handle the search and the pop-up window (using QTreeWidget).

    Since the example is in Qt, I port it to PyQt with small modification https://github.com/ismailsunni/scripts/blob/master/autocomplete_from_url.py

    0 讨论(0)
提交回复
热议问题