PyQt实现预览功能

简介

  最近在做一个标注软件,需要实现一些简单的功能,比如说想看一下所有图片的名字以及标到哪个地方了,专门划出一块区域显示有点大材小用,所以做了实现了这样一个预览功能:当我鼠标移动到某个控件的时候,显示所有图片名称,鼠标离开的时候,隐藏图片名称。
展示图

实现

  1.移入:在这里我是在QToolBar上创建了一个QAction,然后鼠标放在上面即显示。Qt有个非常棒的机制是信号与槽机制,当信号发射时,连接的槽函数会自动执行。在PyQt5中,信号与槽函数通过object.signal.connect()方法进行连接。QAction有几种信号:changed,hovered,toggled,triggered,我们选用的就是hovered了,通过self.actionList.hovered.connect(self.listop)轻松地建立了信号跟槽。

  2.显示:QListWidget类是一个基于条目的接口,用于从列表中添加或删除条目。用这个可以方便很多,比如说你不用考虑列表超过显示区域怎么办,QListWidget会自己生成个滚动条。QListWidget有几个方法,addItem(), insertItem()等等,跟用起来python的list差不多。QListWidget也提供一些信号,比如当列表中的条目发生改变时会有个currentItemChanged信号,可以通过信号与槽机制处理一些事件。

  3.移出:由于QListWidget没有提供鼠标移入移出这种信号,那就不能通过信号与槽机制处理了,需要自己写个事件处理函数。先创建继承QtWidgets.QListWidget的一个类,然后定义个leaveEvent函数,在里面把显示信息隐藏掉就可以了。刚才的QAction判断鼠标是否移入也可以通过这种方式,不过需要重建一个类,有点小麻烦,还是信号与槽方便一些。

代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QSizePolicy

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.RightToolBarArea, self.toolBar)
        self.actionList = QtWidgets.QAction(MainWindow)
        self.actionList.setObjectName("actionList")
        self.toolBar.addAction(self.actionList)
        self.actionList.hovered.connect(self.listop)
        self.listWidget = MyListWidget(MainWindow)
        self.listWidget.setVisible(False)
        self.listWidget.setMouseTracking(True)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
        self.actionList.setText(_translate("MainWindow", "List"))
        self.actionList.setToolTip(_translate("MainWindow", "List"))

    def listop(self):
        self.readnames()
        x, y = self.toolBar.x() , self.toolBar.y()
        width, height = int(self.toolBar.width() * 3), int(self.toolBar.height() / 2)
        self.listWidget.resize(width, height)
        self.listWidget.move(x-width, y)
        self.listWidget.setVisible(True)

    def readnames(self):
        for i in range(100):
            self.listWidget.addItem("image_{}.jpg".format(i))
        

class MyListWidget(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super(MyListWidget, self).__init__(parent)
    
    def leaveEvent(self, e):
        self.setVisible(False)
        self.update()


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

if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    mywindow = Ui_MainWindow()
    mywindow.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值