PyQt5 实现状态栏(statusBar)显示和隐藏功能

首先,讲述要解决的两个问题以及解决问题的代码:

1、将鼠标放置于菜单栏上状态栏永久消失的问题(这个问题需要仔细观察才能注意到)

    # 此覆盖父类函数: 覆盖方法; 为了克服 将鼠标放置于菜单栏上 状态栏就消失的问题;
    def event(self, QEvent):
        if QEvent.type() == QEvent.StatusTip:
            if QEvent.tip() == "":
                QEvent = QStatusTipEvent("ready!")  # 此处为要始终显示的内容
        return super().event(QEvent)

2、控制状态栏显示和隐藏的问题

   def toggleMenu(self, state):  # 自定义事件函数
        print(state)
        # if state:
        #     self.statusBar().showMessage("ready!")
        # else:
        #     self.statusBar().showMessage("")
        # if state:  # 控制状态栏是否显示,
        #     self.statusbar().show()  # 此处是错误示例
        # else:
        #     self.statusbar().hide()

        if state:  # 应该使用statusBar() 而不是 statusbar
            self.statusBar().show()
        else:
            self.statusBar().hide()

最近学习pyqt5教程,也是别人翻译的,总的也是错误多多,应该直接看原版的,充分表明英语很重要啊……

贴上全部代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon, QStatusTipEvent

class main_window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 可以设置 动作的图标, 文字显示; 强大
        exitAct = QAction(QIcon("/Users/zuozhe/PycharmProjects/Soft-Video/images/m4.png"), "&退出", self)
        exitAct.setShortcut("Ctrl+Q")  # 设置快捷键
        exitAct.setToolTip("Exit Application")  # 提示
        exitAct.triggered.connect(qApp.exit)  # 绑定退出事件

        status = self.statusBar()  # 创建状态栏
        status.showMessage("ready!")  # 显示消息

        # 菜单栏
        # 文件菜单栏
        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)  # MAC OS 下需要设置此句话
        fileMenu = menubar.addMenu("&File")  # 主菜单File

        impMenu = QMenu("Import", self)  # 创建菜单项
        impAct = QAction("Import Email", self)  # Import菜单下有子菜单 Import Email
        impMenu.addAction(impAct)

        newAct = QAction("New", self)
        # 就差 给 Action(动作)绑定触发事件了
        fileMenu.addAction(newAct)  # 将两个菜单项加入到 File主菜单栏下
        fileMenu.addMenu(impMenu)
        fileMenu.addAction(exitAct)  # 绑定 File下的菜单项
        # 编辑菜单栏
        editMenu = menubar.addMenu("&Edit")

        # 视图菜单栏
        viewMenu = menubar.addMenu("&View")
        # 勾选菜单
        viewstatAct = QAction("是否显示状态栏", self, checkable=True)
        viewstatAct.setToolTip("View statusbar")
        viewstatAct.setChecked(True)
        viewstatAct.triggered.connect(self.toggleMenu)  # 触发链接事件; toggleMenu是自定义函数
        viewMenu.addAction(viewstatAct)

        # 设置窗口的 位置和大小
        self.setGeometry(300, 300, 500, 600)
        self.setWindowTitle("主窗口的菜单栏和工具栏")
        self.show()

    # 此覆盖父类函数: 覆盖方法; 为了克服 将鼠标放置于菜单栏上 状态栏就消失的问题;
    def event(self, QEvent):
        if QEvent.type() == QEvent.StatusTip:
            if QEvent.tip() == "":
                QEvent = QStatusTipEvent("ready!")  # 此处为要始终显示的内容
        return super().event(QEvent)

    def toggleMenu(self, state):  # 自定义事件函数
        print(state)
        # if state:
        #     self.statusBar().showMessage("ready!")
        # else:
        #     self.statusBar().showMessage("")
        # if state:  # 控制状态栏是否显示,
        #     self.statusbar().show()
        # else:
        #     self.statusbar().hide()

        if state:  # 应该使用statusBar() 而不是 statusbar
            self.statusBar().show()
        else:
            self.statusBar().hide()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = main_window()
    sys.exit(app.exec_())

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5中可以使用多线程来实现状态栏显示系统时间的功能。以下是一个示例代码: ```python import sys import threading from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.statusBar().showMessage("") self.thread = threading.Thread(target=self.update_time) self.thread.daemon = True self.thread.start() self.show() def update_time(self): while True: # 获取当前系统时间 current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 更新状态栏显示内容 self.statusBar().showMessage("当前时间: " + current_time) time.sleep(1) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个继承自QMainWindow的窗口类MainWindow。在初始化函数中,我们首先调用了父类的初始化函数,并创建了一个空的状态栏。然后,我们创建了一个新的线程,并通过调用`start()`方法来启动线程。这里我们使用了`threading`模块来创建线程,可以根据自己的需求选择其他方法。 在`update_time`函数中,我们使用一个循环来不断更新状态栏显示内容。首先,我们通过`datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")`获取当前系统时间,并将其格式化为字符串。然后,我们调用`self.statusBar().showMessage()`方法来更新状态栏显示内容。最后,我们使用`time.sleep(1)`函数使线程休眠1秒钟,以便每秒更新一次状态栏的时间显示。 在`if __name__ == "__main__":`语句中,我们创建了一个QApplication实例,并将其赋值给`app`变量。然后,我们创建了MainWindow实例,并最后调用`app.exec_()`来启动应用程序的主事件循环。 通过运行这段代码,我们可以在应用程序的状态栏上看到当前的系统时间,并且这个显示是以多线程的方式进行更新的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值