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

9

我有几个想要自定义的QLineEdit的QCompleter的功能,希望使其与Chrome中的地址/搜索栏类似。

  1. 如何限制显示的行数?例如,即使有15个匹配项,我只想让QCompleter显示5个。
  2. 如何调整弹出窗口的大小?例如,我想让弹出窗口紧凑美观。与上面的示例相同,我希望弹出窗口的大小恰好调整为5行,而不显示任何丑陋的滚动条。
  3. 如何移动弹出窗口?例如,我想调整弹出窗口的垂直位置,使其略低于父部件。
  4. 如何格式化显示的弹出窗口列表项?例如,我想将匹配的单词部分加粗。

QCompleter::setPopup(QAbstractItemView * popup) - Neel Basu
2个回答

7
  1. 限制行数:将模型更改为QStringListModel,使用QCompleter.setModel设置在弹出窗口显示之前的固定项目数量。同时确保适当设置maxVisibleItems(默认为七)。
  2. 弹出窗口应自动调整到正确的高度。可以通过将边距的宽度(popup.width() - popup.viewport().width())、框架的宽度(2 * popup.frameWidth())和最长字符串的宽度(popup.fontMetrics().boundingRect(string).width())相加来计算弹出窗口的宽度
  3. 通过向QCompleter.complete传递一个适当的QRect,可以控制弹出窗口的位置(和宽度)。
  4. 可以通过设置项代理来控制列表项的格式。有关富文本项代理的示例,请参见此答案。(但请注意,这会影响弹出窗口宽度的计算方式)。

将QRect传递给complete方法在首次打开时有效,但一旦文本更改并且弹出窗口重新调整大小,它就会恢复到原始位置。是否有一种方法可以在编辑文本时保持偏移量?我尝试了子类化listview并在showEvent和resizeEvent中使用move,但似乎效果不太好... - Michael B

2

我尝试了maxVisibleItems,但我不知道它是否是Mac的问题,但它的行为并不像我想象的那样。它只会调整弹出窗口的大小(有点不准确),所以你只能看到5个项目。我期望弹出窗口调整大小并且在弹出列表项中进行裁剪。 - c00kiemonster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接