如果使用 PyQT 只显示一个,是否有自动 select 自动完成选项?

Is there anyway to automatically select an autocomplete option if only one is shown using PyQT?

我正在尝试为用户构建一种非常省时的信息存储方式。它使用文本界面来导航存储数据的树。我有一个 UI 构建的,除了一个之外,它在所有方面都很完美;它会强制您按下向下箭头,然后输入以自动完成,即使输入的子字符串只有一个可能的选项。

例如,假设以下是给定节点的选项

Potato
Cabbage
Dave
Dove
Double

一旦您输入了“P”,您唯一可能引用的就是“Potato”。我想要 select 土豆,而不是强迫用户按“向下”然后“输入”才能 select 它。这可能使用 PyQT 吗?如果是,有哪些实施方案?

一种可能的解决方案是使用来自completionModel()modelResetrowsInsertedrowsRemoved信号,然后检查行数是否为1到select 行,然后隐藏弹出窗口。

from PyQt5.QtCore import QItemSelectionModel, QMetaObject, Qt
from PyQt5.QtWidgets import QApplication, QCompleter, QLineEdit


class Completer(QCompleter):
    def init(self):
        self.completionModel().modelReset.connect(self._handle_count_changed)
        self.completionModel().rowsInserted.connect(self._handle_count_changed)
        self.completionModel().rowsRemoved.connect(self._handle_count_changed)

    def _handle_count_changed(self):
        if self.popup().isVisible() and self.completionModel().rowCount() == 1:
            self.popup().selectionModel().select(
                self.currentIndex(), QItemSelectionModel.Select
            )
            QMetaObject.invokeMethod(self.popup(), "hide", Qt.QueuedConnection)


def main():
    app = QApplication([])

    words = ["Potato", "Cabbage", "Dave", "Dove", "Double"]

    lineedit = QLineEdit()
    lineedit.resize(320, lineedit.sizeHint().height())
    lineedit.show()

    completer = Completer(words, caseSensitivity=Qt.CaseInsensitive)
    completer.init()
    lineedit.setCompleter(completer)

    app.exec_()


if __name__ == "__main__":
    main()