gpt4 book ai didi

python - PyQT4 QMenuBar 可见性由 MouseOver 切换

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:45 28 4
gpt4 key购买 nike

我遇到了一个让我抓狂的问题。我想让 QMenuBar 只有在鼠标悬停时才可见,否则它应该被隐藏。

到目前为止我得到这个“工作”:

class Hidden_Menubar(QtGui.QMenuBar):           
def __init__(self, parent=None):
super(Hidden_Menubar, self).__init__(parent)
self.setMouseTracking(True)

def enterEvent(self,event):
self.show()

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

 class Ui_Template_FullScreen(object):
def setupUi(self, Template_FullScreen):
Template_FullScreen.setObjectName(_fromUtf8("Template_FullScreen"))
Template_FullScreen.showFullScreen()
self.centralwidget = QtGui.QWidget(Template_FullScreen)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
Template_FullScreen.setCentralWidget(self.centralwidget)

self.menubar = Hidden_Menubar(Template_FullScreen)
......

问题是,一旦鼠标停止悬停在 QMenuBar 上,它就会消失(到目前为止一切正常),但是如果我再次悬停在 QMenuBar 区域上,它就不会显示了!我想 mouseMoveEvent 不会在隐藏的对象上触发,或者是其他问题?我尝试了很多解决方案,例如安装事件过滤器,但我无法正确实现。我对 python 和 QT 完全陌生,所以我自己搞不懂。我感谢每一个帮助。

提前致谢 =)

测试.py: http://pastebin.com/hmRvYVup (完整代码)

编辑:感谢大家提供非常有帮助的答案!不幸的是,我无法对您的帖子进行投票,因为我缺少声誉:/

最佳答案

这比看起来更棘手。主要问题是跟踪鼠标在整个窗口(包括所有子窗口小部件)上的移动,并确保仅在适当的时候隐藏菜单(即不在显示菜单时隐藏)。

执行此操作的一种方法是安装 event-filter在 QApplication 上(以便它接收所有子部件的鼠标移动事件),并使用 activePopupWidget检查是否有任何事件菜单的方法。

这是一个展示基本实现的演示脚本:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
# add a few widgets for testing
widget = QtGui.QWidget(self)
edit = QtGui.QTextEdit(widget)
button = QtGui.QPushButton('Button', widget)
layout = QtGui.QVBoxLayout(widget)
layout.addWidget(edit)
layout.addWidget(button)
self.setCentralWidget(widget)
menu = self.menuBar().addMenu('&File')
menu.addAction('&Quit', self.close)
menu = self.menuBar().addMenu('&Edit')
menu.addAction('&Clear', edit.clear)
QtGui.qApp.installEventFilter(self)
# make sure initial window size includes menubar
QtCore.QTimer.singleShot(0, self.menuBar().hide)

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

if __name__ == '__main__':

import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 300, 100)
window.show()
sys.exit(app.exec_())

关于python - PyQT4 QMenuBar 可见性由 MouseOver 切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com