Щелчок QComboBox запускает методEventEvent на главном QDialog - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать диалоговое окно при наведении курсора, но я застрял во взаимодействии между выбором QComboBox и оставлением события QDialog. похоже, что когда я пытаюсь щелкнуть на поле со списком, чтобы выбрать что-то, он запускает функциюEventEvent, которая затем скрывает мой QDialog. Почему это происходит? Что я могу сделать, чтобы диалоговое окно было скрыто, только когда я перемещаю мышь за пределы диалогового окна?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class hoverDialog(QDialog):

    def __init__(self, parent=None):
        super().__init__()
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.v = QVBoxLayout()
        self.combobox = QComboBox()
        self.combobox.addItems(['Work-around','Permanent'])
        self.textedit = QPlainTextEdit()
        self.v.addWidget(self.combobox)
        self.v.addWidget(self.textedit)
        self.setLayout(self.v)
        #self.setMouseTracking(True)

    def leaveEvent(self, event):
        self.hide()
        return super().leaveEvent(event)

class Table(QWidget):

    def __init__(self, parent=None):
        super().__init__()

        self.label4 = QLabel()
        self.label4.setText("hover popup")
        self.label4.installEventFilter(self)
        self.checkbox1 = QCheckBox()

        self.pushButton3 = QPushButton()
        self.pushButton3.setText('Generate')
        self.pushButton3.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        self.pushButton3.clicked.connect(self.buttonPressed)

        self.hbox5 = QHBoxLayout()
        self.hbox5.addWidget(self.checkbox1)
        self.hbox5.addWidget(self.label4)
        self.hbox5.addWidget(self.pushButton3)

        self.vbox1 = QVBoxLayout()
        self.vbox1.addLayout(self.hbox5)

        self.setLayout(self.vbox1)

        self.autoResolve = hoverDialog(self)

    def eventFilter(self, obj, event):
        if obj == self.label4 and event.type() == QtCore.QEvent.Enter and self.autoResolve.isHidden():
            self.onHovered()
        return super().eventFilter(obj, event)

    def onHovered(self):
        pos = QtGui.QCursor.pos()
        self.autoResolve.move(pos)
        self.autoResolve.show()

    def buttonPressed(self):
        if self.checkbox.isChecked():
            print('do something..')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Table()
    form.show()
    app.exec_()

1 Ответ

0 голосов
/ 28 апреля 2020

Глядя на источники, я полагаю, что источником проблемы является поведение Qt всякий раз, когда отображается новый всплывающий виджет.

Я не могу гарантировать это на 100%, но в любом случае самое простое решение чтобы скрыть виджет, только если всплывающее окно со списком не отображается:

def leaveEvent(self, event):
    if not self.combobox.view().isVisible():
        self.hide()

Обратите внимание, что ваш подход на самом деле не идеален: поскольку диалоговое окно может отображаться с геометрией, которая находится вне текущей позиции мыши, он будет не сможет спрятаться, пока мышь не войдет в него. Вероятно, вам следует также отфильтровать события FocusOut и WindowDeactivate.

...