微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

覆盖QCompleter弹出位置

如何解决覆盖QCompleter弹出位置

关于覆盖QCompleter弹出位置也有类似的问题,但我仍然找不到有效的解决方案。我只是想将弹出窗口向下移动5像素左右(我有一些特定的样式要求)

我尝试了子类化QListView,并使用setPopup()将其用作弹出窗口。然后,我重写showEvent并在Y中向下移动弹出窗口。我也在resizeEvent上执行此操作,因为我相信在过滤项目和调整弹出窗口大小时会触发此事件。但是,这是行不通的。.然后我使用单发计时器在1毫秒后触发移动。这项工作确实可行,但似乎并不一致-第一次显示与随后的时间或调整大小不同。

下面是我最近的尝试(试图通过统计弹出窗口的数量来破解它。),希望有人可以告诉我我做错了什么或更好的解决方

import sys
import os
from pyside2 import QtCore,QtWidgets,QtGui

class QPopup(QtWidgets.QListView):
    def __init__(self,parent=None):
        super(QPopup,self).__init__(parent)

        self.popups = 0

    def offset(self):
        y = 3 if self.popups < 2 else 7
        print('y: {}'.format(y))
        self.move(self.pos().x(),self.pos().y() + y)

        self.popups += 1

    def showEvent(self,event):
        print('show')
        # self.offset()
        QtCore.QTimer.singleShot(1,self.offset)

    def resizeEvent(self,event):
        print('resize')
        # self.offset()
        QtCore.QTimer.singleShot(1,self.offset)

class MyDialog(QtWidgets.QDialog):
    def __init__(self,parent=None):
        super(MyDialog,self).__init__(parent)

        self.create_widgets()
        self.create_layout()
        self.create_connections()

    def create_widgets(self):
        self.le = QtWidgets.QLineEdit('')

        self.completer = QtWidgets.QCompleter(self)
        self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
        self.completer.setMaxVisibleItems(10)
        self.completer.setFilterMode(QtCore.Qt.MatchContains)
        self.completer.setPopup(QPopup())

        popup = QPopup(self)
        self.completer.setPopup(popup)

        self.model = QtCore.QStringListModel()
        self.completer.setModel(self.model)

        self.le.setCompleter(self.completer)

        self.completer.model().setStringList(['one','two','three'])

    def create_layout(self):
        main_layout = QtWidgets.QVBoxLayout(self)

        main_layout.addWidget(self.le)

    def create_connections(self):
        pass

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    my_dialog = MyDialog()

    my_dialog.show()  # Show the UI
    sys.exit(app.exec_())

解决方法

一种解决方案是制作QLineEdit的子类并覆盖keyPressEvent以显示带有偏移量的弹出窗口:

PySide2.QtWidgets.QCompleter.complete([rect = QRect()])

对于PopupCompletion和QCompletion :: UnfilteredPopupCompletion模式,调用此函数将显示显示当前补全的弹出窗口。默认情况下,如果未指定rect,则弹出窗口将显示在widget()的底部。如果指定了rect,则弹出窗口将显示在矩形的左边缘。

请参见doc.qt.io -> QCompleter.complete

完整的独立示例

根据光标rect的y位置计算rect。弹出窗口的高度不变。宽度调整为ZLineEdit小部件的宽度。

Implementation.Compound

您的代码(使用上述要点进行了略微修改)可能如下所示:

rect = QtCore.QRect(0,self.cursorRect().y() + 4,self.width(),self.completer().widget().height())

测试

在左侧,您将看到默认行为。在右侧,弹出窗口向下移动4px:

offset

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。