如何在 PyQt 中自定义 QCompleter 弹出窗口?

Posted

技术标签:

【中文标题】如何在 PyQt 中自定义 QCompleter 弹出窗口?【英文标题】:How can I customize the QCompleter popup window in PyQt? 【发布时间】:2011-10-30 16:58:13 【问题描述】:

我有一些关于 QLineEdit 的 QCompleter 的东西,我有兴趣定制。我想让它的行为类似于 Chrome 中的地址/搜索栏。

    如何限制显示的行数?例如,即使有 15 个匹配项,我也只希望 QCompleter 显示 5 个。 如何调整弹出窗口的大小?例如,我想让弹出窗口美观舒适。根据上面的示例,我希望弹出窗口的大小完全调整为 5 行,而不会显示任何难看的滚动条。 如何移动弹出窗口?例如,我想调整弹出窗口的垂直位置,使其略低于父窗口小部件。 如何格式化显示的弹出窗口的列表项?例如,我想将匹配的单词部分加粗。

【问题讨论】:

QCompleter::setPopup(QAbstractItemView * popup) 【参考方案1】:
    要限制行数:将模型更改为 QStringListModel 使用 QCompleter.setModel, 并在显示弹出窗口之前设置固定数量的项目。还要确保 maxVisibleItems 设置得当(默认为 7)。 弹出窗口应该调整到正确的高度 自动地。弹出窗口的 width 可以通过将 边距宽度 (popup.width() - popup.viewport().width()), 框架的宽度 (2 * popup.frameWidth()) 和最长字符串的宽度 (popup.fontMetrics().boundingRect(string).width())。 弹出窗口的位置(和宽度)可以通过传递一个 适当的QRect QCompleter.complete。 列表项的格式可以由弹出窗口上的setting an item delegate 控制。有关富文本项目委托的示例,请参阅 this answer。 (但请注意,这会影响弹出窗口宽度的计算方式)。

【讨论】:

将 QRect 传递给 complete 方法在第一次打开时有效,但一旦文本更改并且弹出窗口调整大小,它就会恢复到原始位置。有没有办法在编辑文本时保持偏移?我尝试对列表视图进行子类化并在 showEvent 和 resizeEvent 中使用移动,但它似乎效果不佳..【参考方案2】:

虽然我从未尝试过相同的文档明确指出使用maxVisibleItems(int maxItem) 来限制可见的数字项。

与弹出窗口的自定义一样,您需要创建QAbstractItemView 的子类并将其传递给QCompleter::setPopup(QAbstractItemView * popup)

设置setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff)

【讨论】:

我试过maxVisibleItems,我不知道这是否是一个mac问题,但它的行为不像我想象的那样。它所做的只是调整弹出窗口的大小(有点,它根本不准确),所以你只能看到 5 个项目。我希望弹出窗口调整大小并且在弹出列表项中也可以裁剪。

以上是关于如何在 PyQt 中自定义 QCompleter 弹出窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中自定义 QGroupBox 标题?

pyqt5的QCompleter自动补全 使用模板

在 PyQt 中自定义 MPL

QComboBox 自动完成 (QCompleter?)

pyqt5 下拉列表添加字典

PyQt: LineEdit的智能输入提示