gpt4 book ai didi

python - 使用谷歌自动完成的 QtQuick 文本搜索自动完成

转载 作者:行者123 更新时间:2023-12-01 08:12:00 33 4
gpt4 key购买 nike

我想使用 QML 创建一个类似的 UI,如下面的链接所示,这是我在 pyqt5 中使用 Qcompleter 的问题, pyqt5 autocomplete QLineEdit - Google places autocomplete 。我们如何在Qt Quick中实现相同的模型,我似乎无法使用QML的TextField中的模型,因为我收到以下错误 enter image description here

最佳答案

使用之前的模型,只需要创建 GUI,在本例中使用 ListView + Popup 实现选择逻辑:

ma​​in.py

import os
import sys
import json
from PyQt5 import QtCore, QtGui, QtNetwork, QtQml

API_KEY = "<API_KEY>"

class SuggestionPlaceModel(QtGui.QStandardItemModel):
finished = QtCore.pyqtSignal()
error = QtCore.pyqtSignal(str)
countChanged = QtCore.pyqtSignal()

def __init__(self, parent=None):
super(SuggestionPlaceModel, self).__init__(parent)
self._manager = QtNetwork.QNetworkAccessManager(self)
self._reply = None

def count(self):
return self.rowCount()

count = QtCore.pyqtProperty(int, fget=count, notify=countChanged)

@QtCore.pyqtSlot(str)
def search(self, text):
self.clear()
self.countChanged.emit()
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.countChanged.emit()
self.finished.emit()
reply.deleteLater()
self._reply = None

if __name__ == '__main__':
app = QtGui.QGuiApplication(sys.argv)
QtQml.qmlRegisterType(SuggestionPlaceModel, "PlaceModel", 1, 0, "SuggestionPlaceModel")
engine = QtQml.QQmlApplicationEngine()
qml_filename = os.path.join(os.path.dirname(__file__), 'main.qml')
engine.load(QtCore.QUrl.fromLocalFile(qml_filename))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())

ma​​in.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

import PlaceModel 1.0

ApplicationWindow {
width: 400
height: 400
visible: true

QtObject {
id: internal
property bool finished: false
property bool busy: false
}

SuggestionPlaceModel{
id: suggestion_model
onFinished: {
internal.busy = false
if(count == 0) internal.finished = true
}
}

TextField {
anchors.centerIn: parent
id: textfield
onTextChanged: {
internal.busy = true
internal.finished = false
Qt.callLater(suggestion_model.search, text)
}
Popup {
id: popup
y: parent.height
visible: !internal.finished && textfield.length > 0
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
contentItem: Loader{
sourceComponent: internal.busy ? busy_component: lv_component
}
}
}

Component{
id: busy_component
BusyIndicator {
running: true
}
}

Component{
id: lv_component
ListView {
implicitWidth: contentItem.childrenRect.width
implicitHeight: contentHeight
model: suggestion_model
delegate: Text {
text: model.display
MouseArea{
id: mousearea
anchors.fill: parent
hoverEnabled: true
onClicked: {
textfield.text = model.display
internal.finished = true
}
}
}
}
}
}

enter image description here

关于python - 使用谷歌自动完成的 QtQuick 文本搜索自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55188052/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com