python - 如何在pyqt上构建鼠标悬停时显示的侧栏菜单?

标签 python qt pyqt qt-designer

我一直在尝试构建一个具有动态侧栏的应用程序。我正在使用 qtdesigner 和 pyqt5。我尝试了两种方法:

1) 使用悬停样式表。但侧边栏(框架)上有按钮。碰巧,当我看到该栏时,我只能看到鼠标所在的按钮。

样式表代码:

QFrame {
                  background-color: rgba(255, 151, 231, 0); 
             }

QFrame:hover {
               background-color:rgba(255, 151, 231, 0.45)
            }

QPushButton {
                color: rgba(0, 0, 0, 0);
                background-color: rgba(255, 151, 231, 0);  
             }

QPushButton:hover {
               background-color:rgba(255, 151, 231, 0.45);
            }

输出:(鼠标位于按钮上)

enter image description here

我知道为什么会发生这种情况,但不知道如何解决。

2) 使用事件

使用事件我可以达到我想要的目的,但我不确定我是否做了正确的事情。

  class TelaPrincipal(QDialog, QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(TelaPrincipal, self).__init__(parent)
        QDialog.__init__(self, parent)
        Ui_Form.__init__(self)
        self.setupUi(self)

        # -- Barra lateral esconde esconde --
        # instala esse EventFilter
        qApp.installEventFilter(self)
        QtCore.QTimer.singleShot(0, self.frame.hide)

    def eventFilter(self, source, event):
         # do not hide frame when frame shown
        if qApp.activePopupWidget() is None:
            if event.type() == QtCore.QEvent.MouseMove:
                if self.frame.isHidden():
                    self.frame.show()
                    rect = self.geometry()
                    # set mouse-sensitive zone
                    rect.setHeight(25)
                    if rect.contains(event.globalPos()):
                        self.frame.show()
                else:
                    rect = QtCore.QRect(
                        self.frame.mapToGlobal(QtCore.QPoint(0, 0)),
                        self.frame.size())
                    if not rect.contains(event.globalPos()):
                        self.frame.hide()
            elif event.type() == QtCore.QEvent.Leave and source is self:
                self.frame.hide()
        return QMainWindow.eventFilter(self, source, event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = TelaPrincipal()
    main.show()
    sys.exit(app.exec())

你对我有什么建议?

最佳答案

花了一点时间阅读文档。我发现的最简单的方法是:

在 init 类中我安装了一个过滤器,然后覆盖了 eventFilter 方法。

class MainScreen(QMainWindow, QDialog,  Ui_TelaPrincipal):
    def __init__(self, parent=None):
        super(MainScreen, self).__init__(parent)
        QDialog.__init__(self, parent)
        QMainWindow.__init__(self, parent)
        Ui_MainScreen.__init__(self)
        self.setupUi(self)

        # ---- side bar ---- #
        # installs a filter event
        qApp.installEventFilter(self)
        # hide the bar 
        QTimer.singleShot(0, self.plano_barra.hide)

        self.plano_central.setMouseTracking(1)
        self.plano_botao_barra.setMouseTracking(1)
        self.setMouseTracking(1)
        self.plano_principal.setMouseTracking(1)


    def eventFilter(self, source, event):
        if event.type() == QEvent.MouseMove:
            if source == self.plano_botao_barra:
                print("i am over the button")
                self.plano_barra.show()

            if source == self.plano_central:
                print("i am at the main plan")
                self.plano_barra.hide()

        return QMainWindow.eventFilter(self, source, event)

关于python - 如何在pyqt上构建鼠标悬停时显示的侧栏菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018549/

相关文章:

python - 类不能使用 mypy 子类化 'QObject'(类型为 'Any')

python - 单击外部 url 链接时窗口不会打开新窗口或选项卡

python - OpenCV 子图带有标题和边框周围的空间

python - Pandas 在夜间重新采样

linux - 在哪里可以获得更多 qtcreator 小部件?

c++ - 使 QTreeWidget 只有一列可编辑//疑难解答

c++ - qt打开一个带有不支持警告图像格式的jpg文件

python - 在 for 循环中将多个按钮连接到同一函数

python - 将图像添加到 GUI 后,Tkinter GUI 未打开

python - 检索 Python 中的命令行参数