python - pyqt5 自动完成 QLineEdit - Google 放置自动完成

标签 python pyqt pyqt5 qlineedit qcompleter

我正在尝试在 pyqt5 QLineEdit 中创建类似的东西(自动完成位置)。

enter image description here

enter image description here

有一个名为 QCompleter 的类,我可以用它来建议内容,但它需要一个已经形成的列表,但是这个 google place api 是一个基于建议的函数,我如何将每个击键发送到 google api 并获取建议并在Qtextedit中加载,有没有更好的方法来做到这一点

最佳答案

对于这种情况,您可以创建一个自定义模型,使用 Place Autocomplete 发出请求。 ,并将该模型设置为 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_())

enter image description here

关于python - pyqt5 自动完成 QLineEdit - Google 放置自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55027186/

相关文章:

python - 无法弄清楚为什么我的代码不适用于特定情况(Leetcode 的硬币找零)

python - 如何用列名填充数据框的真实值?

python - PyQt4 和 Windows 7 缩略图工具栏

python - 以编程方式获取和设置 QTreeview 中的事件行 (PyQt)

python - 为自定义 QWidget 设置背景颜色

python - PyQt:如何在 Raspberry Pi 桌面启动时运行 GUI?

python - 有没有巧妙的方法将 key 传递给 defaultdict 的 default_factory?

python - 另一个无法解析超链接关系 URL 的错误

python - PyQt4中PYSIGNAL定义了什么模块

python - PyQt5 Pyqtgraph 离散图