我这里首先用qt创建ui界面导入然后编写脚本,话不多说,上代码和注释
# -*- 编码:UTF-8 -*-
"""
QGIS 窗体可具有在打开窗体时调用的 Python 函数。
使用该函数向窗体添加额外的逻辑。
在“Python Init 函数”字段中输入函数的名称。
示例如下:
"""
from qgis.PyQt.QtWidgets import QWidget, QLabel, QComboBox
mycombox=None
def my_form_open(dialog, layer, feature):
geom = feature.geometry()
global mycombox
#查找名称为comboBox的QComboBox类型控件
mycombox = dialog.findChild(QComboBox, "comboBox")
# mycombox = ExtendedComboBox()
l = ["23", "1aew_哈哈哈", "2asd_都会好的","11ofmsw_肯定会的"]
mycombox.addItems(l)
strText=mycombox.currentText()
if strText.find("_")>=0 :
nPos=strText.index("_")
mycombox.setCurrentText(strText[nPos+1:])
#添加QComboBox选中事件
mycombox.currentIndexChanged.connect(select)
def select():
strText=mycombox.currentText()
nPos=strText.index("_")
mycombox.setCurrentText(strText[nPos+1:])
from PyQt5.QtWidgets import QWidget, QComboBox, QLineEdit, QApplication
from PyQt5.QtGui import QMouseEvent
from PyQt5.Qt import Qt, QRect, QCompleter, QSortFilterProxyModel
import sys
# 带搜索功能的下拉框
class ExtendedComboBox(QComboBox):
def __init__(self, parent=None):
super(ExtendedComboBox, self).__init__(parent)
# self.setFocusPolicy(Qt.StrongFocus)
self.setEditable(True)
# 添加筛选器模型来筛选匹配项
self.pFilterModel = QSortFilterProxyModel(self)
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) # 大小写不敏感
self.pFilterModel.setSourceModel(self.model())
# 添加一个使用筛选器模型的QCompleter
self.completer = QCompleter(self.pFilterModel, self)
# 始终显示所有(过滤后的)补全结果
self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
self.completer.setCaseSensitivity(Qt.CaseInsensitive) # 不区分大小写
self.setCompleter(self.completer)
# Qcombobox编辑栏文本变化时对应的槽函数
self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
self.completer.activated.connect(self.on_completer_activated)
# 当在Qcompleter列表选中候,下拉框项目列表选择相应的子项目
def on_completer_activated(self, text):
if text:
index = self.findText(text)
self.setCurrentIndex(index)
# self.activated[str].emit(self.itemText(index))
# 在模型更改时,更新过滤器和补全器的模型
def setModel(self, model):
super(ExtendedComboBox, self).setModel(model)
self.pFilterModel.setSourceModel(model)
self.completer.setModel(self.pFilterModel)
# 在模型列更改时,更新过滤器和补全器的模型列
def setModelColumn(self, column):
self.completer.setCompletionColumn(column)
self.pFilterModel.setFilterKeyColumn(column)
super(ExtendedComboBox, self).setModelColumn(column)
# 回应回车按钮事件
def keyPressEvent(self, e):
if e.key() == Qt.Key_Enter & e.key() == Qt.Key_Return:
text = self.currentText()
index = self.findText(text, Qt.MatchExactly | Qt.MatchCaseSensitive)
self.setCurrentIndex(index)
self.hidePopup()
super(ExtendedComboBox, self).keyPressEvent(e)
else:
super(ExtendedComboBox, self).keyPressEvent(e)
def run():
app = QApplication(sys.argv)
win = ExtendedComboBox()
l = ["", "1aew", "2asd", "3ewqr", "3ewqc", "2wqpu", "1kjijhm", "4kjndw", "5ioijb", "6eolv", "11ofmsw"]
win.addItems(l)
win.show()
sys.exit(app.exec_())