Были похожие вопросы о переопределении позиции всплывающего окна 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_())