0
点赞
收藏
分享

微信扫一扫

QGIS属性表单QT界面Python脚本编写

水墨_青花 2022-02-16 阅读 72

我这里首先用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_())

 

举报

相关推荐

0 条评论