关于覆盖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小部件的宽度。
rect = QtCore.QRect(0,
self.cursorRect().y() + 4,
self.width(),
self.completer().widget().height())
使用上述要点稍加修改的代码可能如下所示:
import sys
from PySide2 import QtCore, QtWidgets
from PySide2.QtWidgets import QLineEdit, QDialog, QCompleter
class ZLineEdit(QLineEdit):
def __init__(self, string, parent=None):
super().__init__(string, parent)
def keyPressEvent(self, event):
super().keyPressEvent(event)
if len(self.text()) > 0:
rect = QtCore.QRect(0,
self.cursorRect().y() + 4,
self.width(),
self.completer().widget().height())
self.completer().complete(rect)
class MyDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.le = ZLineEdit('')
autoList = ['one', 'two', 'three']
self.completer = QCompleter(autoList, self)
self.setup_widgets()
self.create_layout()
self.create_connections()
def setup_widgets(self):
self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
self.completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
self.completer.setMaxVisibleItems(10)
self.completer.setFilterMode(QtCore.Qt.MatchContains)
self.le.setCompleter(self.completer)
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()
sys.exit(app.exec_())
测试
在左侧,您将看到默认行为。在右侧,弹出窗口向下移动4px:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句