gpt4 book ai didi

python - 使用 QCompleter 全局输入?

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:04 25 4
gpt4 key购买 nike

我在 QLineEdit 中实现了一个标准的 PyQt QCompleter,其内容是:

self.cam_completer = QtGui.QCompleter( self.cameras, self )
self.cam_completer.setCaseSensitivity( 0 )
self.cam_completer.setCompletionMode( 2 )
self.CamerasSearch.setCompleter( self.cam_completer )

其中 self.cameras 是字符串的 list,例如:

['cam0001:left', 'cam0001:right', 'cam0002:left', 'cam0002:right', etc...]

QLineEdit 中,输入 cam 将返回所有项目,cam0001 将仅返回前 2 个,等等。但是,当我输入cam*,没有任何返回。

我希望能够在搜索时通配模式,包括 *?。例如,搜索 cam000?:left 将从结果中删除 cam0010:left

最佳答案

看起来您将不得不实现您自己的完成器。下面是一个使用正则表达式来过滤补全的示例:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

#---------
# IMPORT
#---------
import sys, random

import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)

from PyQt4 import QtGui, QtCore

#---------
# DEFINE
#---------
class QDialogTest(QtGui.QDialog):
def __init__(self, parent=None):
super(QDialogTest, self).__init__(parent)

self.maxVisibleItems = 7

self.lineEdit = QtGui.QLineEdit(self)
self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)

self.standardItemModel = QtGui.QStandardItemModel(self)

with open("/usr/share/dict/words", "r") as fileInput:
for line in random.sample(fileInput.readlines(), 111):
self.standardItemModel.appendRow(
QtGui.QStandardItem(line.strip())
)

self.sortFilterProxyModel = QtGui.QSortFilterProxyModel(self)
self.sortFilterProxyModel.setSourceModel(self.standardItemModel)
self.sortFilterProxyModel.setFilterKeyColumn(0)

self.tableView = QtGui.QTableView(self)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.setModel(self.sortFilterProxyModel)

self.pushButtonClose = QtGui.QPushButton(self)
self.pushButtonClose.setText("Close")
self.pushButtonClose.clicked.connect(sys.exit)

self.layoutVertical = QtGui.QVBoxLayout(self)
self.layoutVertical.addWidget(self.tableView)
self.layoutVertical.addWidget(self.lineEdit)
self.layoutVertical.addWidget(self.pushButtonClose)

self.tableViewPopup = QtGui.QTableView(self)
self.tableViewPopup.setModel(self.sortFilterProxyModel)
self.tableViewPopup.setWindowFlags(QtCore.Qt.Popup)
self.tableViewPopup.setFocusPolicy(QtCore.Qt.NoFocus)
self.tableViewPopup.setFocusProxy(self.lineEdit)
self.tableViewPopup.setMouseTracking(True)
self.tableViewPopup.setEditTriggers(QtGui.QTableView.NoEditTriggers)
self.tableViewPopup.setSelectionBehavior(QtGui.QTableView.SelectRows)
self.tableViewPopup.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)
self.tableViewPopup.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.tableViewPopup.horizontalHeader().setStretchLastSection(True)
self.tableViewPopup.horizontalHeader().hide()
self.tableViewPopup.verticalHeader().hide()
self.tableViewPopup.verticalHeader().setDefaultSectionSize(20)
self.tableViewPopup.doubleClicked.connect(self.setCurrentCompletion)
self.tableViewPopup.installEventFilter(self)

def setCurrentCompletion(self):
self.closePopup()

indexes = self.tableViewPopup.selectionModel().selectedIndexes()

self.lineEdit.blockSignals(True)
self.lineEdit.setText(indexes[0].data(QtCore.Qt.DisplayRole))
self.lineEdit.blockSignals(False)

def closePopup(self):
self.tableViewPopup.hide()
self.lineEdit.setFocus()

def eventFilter(self, obj, event):
if obj != self.tableViewPopup:
return False

elif event.type() == QtCore.QEvent.MouseButtonPress:
self.closePopup()

elif event.type() == QtCore.QEvent.KeyPress:
if event.key() in [
QtCore.Qt.Key_Enter,
QtCore.Qt.Key_Return
]:
self.setCurrentCompletion()

elif event.key() in [
QtCore.Qt.Key_Escape
]:
self.closePopup()

elif not event.key() in [
QtCore.Qt.Key_Up,
QtCore.Qt.Key_Down,
QtCore.Qt.Key_Home,
QtCore.Qt.Key_End,
QtCore.Qt.Key_PageUp,
QtCore.Qt.Key_PageDown
]:
self.lineEdit.event(event)

return super(QDialogTest, self).eventFilter(obj, event)

@QtCore.pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
self.tableViewPopup.hide()

if text != "":
self.setCompletionPrefix(text)

def setCompletionPrefix(self, prefix):
self.sortFilterProxyModel.setFilterRegExp(QtCore.QRegExp(prefix))

if self.sortFilterProxyModel.rowCount():
self.complete()

def complete(self):
self.tableViewPopup.move(
self.lineEdit.mapToGlobal(
QtCore.QPoint(0, self.lineEdit.height())
)
)
self.tableViewPopup.resize(
self.lineEdit.width(),
self.tableViewPopup.verticalHeader().defaultSectionSize() * min(
self.maxVisibleItems,
self.sortFilterProxyModel.rowCount()
) + 2
)
self.tableViewPopup.setFocus()
self.tableViewPopup.show()

#---------
# MAIN
#---------
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
app.setApplicationName('QDialogTest')

main = QDialogTest()
main.resize(333, 333)
main.exec_()

sys.exit(app.exec_())

关于python - 使用 QCompleter 全局输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158715/

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