一、前言
在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片、拖动图片、放大和缩小图片。
最终实现的图片查看器你效果如下:
二、主要步骤
1.显示图片
PyQt5 绘图系统能渲染矢量图像、位图图像和轮廓字体文本。一般会使用在修改或者提高现有组件的功能,或者创建自己的组件,使用 PyQt5 的绘图 API 进行操作。在 Qt 中有 QPainter 类用于执行绘制的操作,绘图由 paintEvent() 来完成,绘图的代码要放在 QPainter 对象的 start() 和 end() 方法之间。
要将图片显示出来,首先是继承 QWidget,然后实现 paintEvent() 方法,主要是使用 drawPixmap() 方法,需要传入 QPixmap 对象并将其绘制出来,绘图的代码如下:
def paintEvent(self, e): """ receive paint events :param e: QPaintEvent :return: """ if self.scaled_img: painter = QPainter() painter.begin(self) painter.drawPixmap(self.point, self.scaled_img) painter.end()
2.拖动图片
在图片成功显示出来之后,需要能够去拖动图片,以便于查看图片的每个角落,主要得实现三个方法:mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent,分别对应移动鼠标、点击鼠标和松开鼠标三个事件。
思路是获取鼠标点击时的位置,然后根据鼠标位置的变化来计算图片需要移动的距离,再移动图片就行了。具体代码如下:
def mouseMoveEvent(self, e): """ mouse move events for the widget :param e: QMouseEvent :return: """ if self.left_click: self.end_pos = e.pos() - self.start_pos self.point = self.point + self.end_pos self.start_pos = e.pos() self.repaint() def mousePressEvent(self, e): """ mouse press events for the widget :param e: QMouseEvent :return: """ if e.button() == Qt.LeftButton: self.left_click = True self.start_pos = e.pos() def mouseReleaseEvent(self, e): """ mouse release events for the widget :param e: QMouseEvent :return: """ if e.button() == Qt.LeftButton: self.left_click = False
3.打开文件
有时候我们会想打开本地的文件进行查看,所以还要实现一个打开文件的功能。而要实现这一功能,可以用 QFileDialog 类来实现,该类里有一个 getOpenFileName() 方法,使用该方法能够打开本地路径并选择符合文件要求格式的文件,例如使用“*.png”就支持打开所有 png 格式的图片文件,而不支持其他格式的文件。
getOpenFileName() 方法有两个返回值,第一个返回值是所选择的文件的路径,第二个返回值是文件类型,得到文件路径后就能创建一个 QPixmap 对象,再使用前面显示图片的方法进行显示,具体代码如下:
def open_image(self): """ select image file and open it :return: """ img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File", "*.jpg;;*.png;;*.jpeg") self.box.set_image(img_name)
4.放大缩小图片
在查看图片的时候,有时候会需要放大了观看图片的某些细节部分,因而需要实现放大和缩小图片的功能,所以做了两个按钮分别用于放大图片和缩小图片。
在 QPainter 中,可以根据 QPainter 的坐标系进行各种变换,例如平移(translate)和变化(scale),这里就可以通过使用 scale() 方法实现放大和缩小图片。下面是两个按钮点击时触发的方法的具体代码:
def large_click(self): """ used to enlarge image :return: """ if self.box.scale < : self.box.scale += . self.box.adjustSize() self.update() def small_click(self): """ used to reduce image :return: """ if self.box.scale > .: self.box.scale -= . self.box.adjustSize() self.update()
完整代码已上传到 GitHub !
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]