实验窗口控件类

该代码定义了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承PyQt6的基本控件类,并添加了一些自定义的功能来实现。

类和方法

BWidget

BWidget 继承自 QWidget,实现了一个基础窗口小部件类,包含移动和调整大小事件的日志记录功能。

方法:

  • __init__(self, name='Noname', parent=None):初始化窗口小部件。

    • name:窗口小部件名称,默认为’Noname’。
    • parent:父窗口。
    • 初始化属性对象并恢复窗口几何设置。
  • closeEvent(self, event):处理窗口关闭事件。

    • event:关闭事件。
    • 保存窗口几何设置并调用父类的关闭事件处理方法。

BFrame

BFrame 继承自 QFrame,实现了一个基础框架类,包含移动和调整大小事件的日志记录功能。

方法:

  • __init__(self, name='Noname', parent=None):初始化框架。

    • name:框架名称,默认为’Noname’。
    • parent:父窗口。
    • 初始化属性对象并恢复框架几何设置。
  • closeEvent(self, event):处理框架关闭事件。

    • event:关闭事件。
    • 保存框架几何设置并调用父类的关闭事件处理方法。

BMainWindow

BMainWindow 继承自 QMainWindow,实现了一个基础主窗口类,包含移动和调整大小事件的日志记录功能。

方法:

  • __init__(self, name='Noname', parent=None):初始化主窗口。

    • name:主窗口名称,默认为’Noname’。
    • parent:父窗口。
    • 初始化属性对象并恢复主窗口几何设置。
  • closeEvent(self, event):处理主窗口关闭事件。

    • event:关闭事件。
    • 保存主窗口几何设置并调用父类的关闭事件处理方法。

CustomCompleter

CustomCompleter 继承自 QCompleter,实现了一个自定义的自动完成器。

方法:

  • __init__(self, items, parent=None, match_flag='contains'):初始化自动完成器。

    • items:自动完成项。
    • parent:父窗口。
    • match_flag:匹配标志,默认为’contains’。
    • 设置完成模式为弹出完成。
  • pathFromIndex(self, index):根据索引返回路径。

    • index:索引。
    • 根据匹配标志返回路径。

SearchComboBox

SearchComboBox 继承自 QComboBox,实现了一个带有自动完成功能的组合框。

方法:

  • __init__(self, parent=None, match_flag='contains'):初始化组合框。

    • parent:父窗口。
    • match_flag:匹配标志,默认为’contains’。
    • 设置可编辑性和自动完成器。
  • add_if_new(self, text):如果文本不存在,则添加并返回索引。

    • text:文本。
    • 如果文本不存在于组合框中,则添加并返回其索引。
  • find_or_add(self, text):如果文本存在则设置当前项,如果不存在则添加并设置当前项。

    • text:文本。
    • 查找或添加文本,并设置为当前项。

SearchLineEdit

SearchLineEdit 继承自 QLineEdit,实现了一个自定义的文本编辑控件,用于SearchComboBox

方法:

  • __init__(self, parent=None):初始化文本编辑控件。

    • parent:父窗口。
  • keyPressEvent(self, event):处理按键事件。

    • event:按键事件。
    • 根据按键类型执行相应操作。
  • focusInEvent(self, event):处理获得焦点事件。

    • event:获得焦点事件。
    • 选择所有文本。
  • focusOutEvent(self, event):处理失去焦点事件。

    • event:失去焦点事件。
    • 存储当前文本。

类的详细说明

BWidget

BWidget类是一个基础窗口小部件类,包含移动和调整大小事件的日志记录功能。

class BWidget(QWidget):
    """ base class of balic Widgets
        includes logging of move and resize events"""

    def __init__(self,name='Noname',parent=None):
        super().__init__(parent)
        self._props=Properties(name)
        self._name = name
        settings=QtCore.QSettings("balic", self._name)
        try:
            self.restoreGeometry(settings.value("geometry"))
        except:
            print('geometry not found')

    def closeEvent(self,event):
        settings=QtCore.QSettings("balic", self._name)
        settings.setValue("geometry", self.saveGeometry())
        super().closeEvent(event)

BFrame

BFrame类是一个基础框架类,包含移动和调整大小事件的日志记录功能。

class BFrame(QFrame):
    """ base class of balic Widgets
        includes logging of move and resize events"""

    def __init__(self,name='Noname',parent=None):
        super().__init__(parent)
        self._props=Properties(name)
        self._name = name
        settings=QtCore.QSettings("balic", self._name)
        try:
            self.restoreGeometry(settings.value("geometry"))
        except:
            print('geometry not found')

    def closeEvent(self,event):
        settings=QtCore.QSettings("balic", self._name)
        settings.setValue("geometry", self.saveGeometry())
        super().closeEvent(event)

BMainWindow

BMainWindow类是一个基础主窗口类,包含移动和调整大小事件的日志记录功能。

class BMainWindow(QMainWindow):
    def __init__(self,name='Noname',parent=None):
        super().__init__(parent)
        self._props=Properties(name)
        self._name = name
        settings=QtCore.QSettings("balic", self._name)
        try:
            self.restoreGeometry(settings.value("geometry"))
        except:
            print('geometry not found')
        self.setWindowTitle(name)

    def closeEvent(self,event):
        settings=QtCore.QSettings("balic", self._name)
        settings.setValue("geometry", self.saveGeometry())
        super().closeEvent(event)

CustomCompleter

CustomCompleter类是一个自定义的自动完成器,用于实现不同的匹配方式。

class CustomCompleter(QCompleter):
    def __init__(self, items, parent=None, match_flag='contains'):
        super(CustomCompleter, self).__init__(items, parent)
        self.setCompletionMode(QCompleter.CompletionMode.PopupCompletion)
        self.match_flag = match_flag

    def pathFromIndex(self, index):
        path = index.data()
        if self.match_flag == 'contains' and self.completionPrefix() in path:
            return path
        elif self.match_flag == 'begins' and path.startswith(self.completionPrefix()):
            return path
        return ''

SearchComboBox

SearchComboBox类是一个带有自动完成功能的组合框,允许用户搜索和选择项。

class SearchComboBox(QComboBox):
    """
    QComboBox with the autocompleter QCompleter enabled.
    This adds an editable QLineEdit which allows the contents of the combobox to be searched.
    Filtered list appears as a popup below the search box.
    The full list can be accessed by click the drop-down arrow.
    match_flag: can be either 'contains' or 'begins to get the matchFlag to MatchContains or MatchStartsWith.
    Has a custom QLineEdit called SearchLineEdit.
    """
    def __init__(self, parent=None, match_flag='contains'):
        super().__init__(parent)
        self.setLineEdit(SearchLineEdit(self))
        self.setEditable(True)
        self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert)
        self.completer = CustomCompleter(self.model(), self, match_flag)
        self.setCompleter(self.completer)
        self.setDuplicatesEnabled(False)

    def add_if_new(self, text):
        """if it's in the box, add it. return the index of the item"""
        idx = self.findText(text)
        if

 idx < 0:  # findText returns -1 if the item isn't in the combobox
            self.addItem(text)
            idx = self.findText(text)
        return idx

    def find_or_add(self, text):
        """if it's in the box, set it, if not, add and set it"""
        idx = self.add_if_new(text)
        self.setCurrentIndex(idx)

SearchLineEdit

SearchLineEdit类是SearchComboBox的自定义文本编辑控件,处理特殊的按键事件和焦点事件。

class SearchLineEdit(QLineEdit):
    """
    Custom QLineEdit for the SearchComboBox class.
    On focus in (e.g. when clicked on for the first time) the full text is selected.
    On focus out or pressing enter, the current text is stored. When pressing escape, the stored text is applied.
    On escape, reverts the
    """
    def __init__(self, parent=None):
        super().__init__(parent)
        self.parent = parent

    def keyPressEvent(self, event: QKeyEvent):
        if event.key() == Qt.Key.Key_Escape:
            self.setText(self.lastText)
        elif event.key() == Qt.Key.Key_Enter:
            self.lastText = self.text()
        else:
            super().keyPressEvent(event)

    def focusInEvent(self, event):
        super().focusInEvent(event)
        QTimer.singleShot(0, self.selectAll)  # ensures other events are processed first. Prevents UI locking up.

    def focusOutEvent(self, event):
        super().focusInEvent(event)
        self.lastText = self.text()

总结

该代码实现了几个自定义的GUI控件类,包括基础窗口小部件、框架、主窗口以及带有自动完成功能的组合框和自定义的文本编辑控件。这些控件通过继承PyQt6的基本控件类,并添加了一些自定义的功能来实现。