Всплывающее окно при наведении курсора на виджет не открывается/закрывается должным образомPython

Программы на Python
Ответить
Anonymous
 Всплывающее окно при наведении курсора на виджет не открывается/закрывается должным образом

Сообщение Anonymous »

Я создал всплывающее окно, которое отображается/скрывается при наведении курсора на QLabel. Единственная проблема заключается в том, что когда я наводю курсор на метку, главное окно почти мигает и исчезает из «активности», а всплывающее окно все еще не появляется.
Я создал простое главное окно с меткой. При наведении на метку появляется предварительный просмотр - qframe (окно почти без полей и без ограничений по размеру по сравнению с главным окном). Проблема здесь в том, что при наведении курсора главное окно быстро мигает, переходя в «активность» и выключаясь, а всплывающее окно не появляется или появляется долго.
Я понял, что когда положение qframe перекрывается/внутри главного окна, то есть когда я устанавливаю положение фрейма в положение мыши — именно тогда возникает проблема с мерцанием. Однако если положение фрейма полностью находится за пределами окна, он легко появляется и исчезает при наведении курсора на метку.
Предварительный просмотр (Соответствующий код):

Код: Выделить всё

class Preview(QtWidgets.QLabel):
def __init__(self, title, value, key, date_time):
super().__init__()
.................
self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint | QtCore.Qt.Popup | QtCore.Qt.Tool)
self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
self.setFocusPolicy(QtCore.Qt.NoFocus)

self.setAttribute(QtCore.Qt.WA_AlwaysStackOnTop)
.....................

HoverLabel:

Код: Выделить всё

 class HoverLabel(QtWidgets.QLabel):
def __init__(self, preview: Preview):
super().__init__()
self._preview = preview
self.setMouseTracking(True)
self.setText("Status: 21.83")
self.setStyleSheet("""background-color: blue;""")

@typing_extensions.override
def enterEvent(self, event):
global_pos = QtGui.QCursor.pos()
self._preview.move(global_pos)
self._preview.raise_()
self._preview.show()
return super().enterEvent(event)

@typing_extensions.override
def leaveEvent(self, event):
self._preview.hide()
return super().leaveEvent(event)
Основное окно:

Код: Выделить всё

class MainWindow(QtWidgets.QMainWindow):

def __init__(self):
super().__init__()

self.resize(500, 400)
self._preview_window = Preview("Status", "21.83380094418226", "Property Key", "2026/01/29 - 08:54:20")
self.test_label = HoverLabel(self._preview_window)

container = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(container)
layout.addWidget(self.test_label)

self.setCentralWidget(container)
Пример изображения (когда рамка наконец появляется после мерцания):
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... g-properly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»