Pyqt5真的太难了,这前端活太难顶了,写了三天,图片展示,就弄出来一个半成品,是我太菜了。
参考了多个网上的资料,大家看着用吧,我郁某人再也不用这玩意了,立此贴为证!!!
以下代码实现了是鼠标拖动图片,和滚轮放大/缩小图片
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'top-half.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QImageReader
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog
from PyQt5.Qt import QPixmap, QPoint, Qt, QPainter, QIcon
from PyQt5.QtCore import QSize
class ImageBox(QWidget):
def __init__(self):
super(ImageBox, self).__init__()
self.img = None
self.scaled_img = None
self.point = QPoint(0, 0)
self.start_pos = None
self.end_pos = None
self.left_click = False
self.scale = 1
def init_ui(self):
self.setWindowTitle("ImageBox")
def set_image(self, img_path):
"""
open image file
:param img_path: image file path
:return:
"""
# img = QImageReader(img_path)
# img.setScaledSize(QSize(self.size().width(), self.size().height()))
# img = img.read()
self.img = QPixmap(img_path)
self.scaled_img = self.img
def paintEvent(self, e):
"""
receive paint events
:param e: QPaintEvent
:return:
"""
if self.scaled_img:
painter = QPainter()
painter.begin(self)
painter.scale(self.scale, self.scale)
painter.drawPixmap(self.point, self.scaled_img)
painter.end()
def wheelEvent(self, event):
angle = event.angleDelta() / 8 # 返回QPoint对象,为滚轮转过的数值,单位为1/8度
angleY = angle.y()
# 获取当前鼠标相对于view的位置
if angleY > 0:
self.scale *= 1.1
else: # 滚轮下滚
self.scale *= 0.9
self.adjustSize()
self.update()
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
class Ui_Form(QWidget):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(1020, 726)
self.scrollArea = QtWidgets.QScrollArea(Form)
self.scrollArea.setGeometry(QtCore.QRect(240, 50, 719, 309))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.box = ImageBox()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, self.box.width(), self.box.height()))
self.scrollAreaWidgetContents.setMinimumSize(QtCore.QSize(719, 309))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.gridLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
self.gridLayout.setObjectName("gridLayout")
self.gridLayout.addWidget(self.box, 0, 0, 1, 1)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.open_file = QtWidgets.QPushButton(Form)
self.open_file.setGeometry(QtCore.QRect(30, 100, 81, 41))
font = QtGui.QFont()
font.setFamily("Aharoni")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.open_file.setFont(font)
self.open_file.setObjectName("open_file")
self.open_file.clicked.connect(self.open_image)
self.progressBar = QtWidgets.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(240, 370, 751, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.line = QtWidgets.QFrame(Form)
self.line.setGeometry(QtCore.QRect(50, 410, 911, 16))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.start_check = QtWidgets.QPushButton(Form)
self.start_check.setGeometry(QtCore.QRect(130, 100, 81, 41))
font = QtGui.QFont()
font.setFamily("Aharoni")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.start_check.setFont(font)
self.start_check.setObjectName("start_check")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(40, 170, 61, 31))
font = QtGui.QFont()
font.setFamily("Aharoni")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(40, 300, 61, 31))
font = QtGui.QFont()
font.setFamily("Aharoni")
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.open_file.setText(_translate("Form", "选择文件"))
self.start_check.setText(_translate("Form", "开始检测"))
self.label.setText(_translate("Form", "文件名称:"))
self.label_2.setText(_translate("Form", "检测状态:"))
def open_image(self):
"""
select image file and open it
:return:
"""
# img_name, _ = QFileDialog.getOpenFileName(self, "打开图片", "", "All Files(*);;*.jpg;;*.png")
img_name, _ = QFileDialog.getOpenFileName(None, "Open Image File","","All Files(*);;*.jpg;;*.png;;*.jpeg")
img = QPixmap(img_name)
print(img.width(),"+",img.height())
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, img.width(), img.height()))
self.box.set_image(img_name)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
以下代码是网上的大佬给的,原链接。该代码实现了点击按钮放大/缩小和鼠标拖动图片,逻辑更加清晰。相比来说,上面代码是将其和Qt Designer生成的样式代码进行了结合,希望能对你有所帮助。
import sys
from PyQt5.QtGui import QImageReader
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog
from PyQt5.Qt import QPixmap, QPoint, Qt, QPainter, QIcon
from PyQt5.QtCore import QSize
class ImageBox(QWidget):
def __init__(self):
super(ImageBox, self).__init__()
self.img = None
self.scaled_img = None
self.point = QPoint(0, 0)
self.start_pos = None
self.end_pos = None
self.left_click = False
self.scale = 1
def init_ui(self):
self.setWindowTitle("ImageBox")
def set_image(self, img_path):
"""
open image file
:param img_path: image file path
:return:
"""
# img = QImageReader(img_path)
# img.setScaledSize(QSize(self.size().width(), self.size().height()))
# img = img.read()
self.img = QPixmap(img_path)
self.scaled_img = self.img
def paintEvent(self, e):
"""
receive paint events
:param e: QPaintEvent
:return:
"""
if self.scaled_img:
painter = QPainter()
painter.begin(self)
painter.scale(self.scale, self.scale)
painter.drawPixmap(self.point, self.scaled_img)
painter.end()
def mouseMoveEvent(self, e):
"""
mouse move events for the widget
:param e: QMouseEvent
:return:
"""
if self.left_click:
size = self.size().width()
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
class MainDemo(QWidget):
def __init__(self):
super(MainDemo, self).__init__()
self.setWindowTitle("Image Viewer")
self.setFixedSize(1000, 600)
self.open_file = QPushButton("Open Image")
self.open_file.setToolTip("Open the image to view.")
self.open_file.clicked.connect(self.open_image)
self.open_file.setFixedSize(150, 30)
self.zoom_in = QPushButton("")
self.zoom_in.clicked.connect(self.large_click)
self.zoom_in.setFixedSize(30, 30)
in_icon = QIcon("icons/zoomIn.png")
self.zoom_in.setIcon(in_icon)
self.zoom_in.setIconSize(QSize(30, 30))
self.zoom_out = QPushButton("")
self.zoom_out.clicked.connect(self.small_click)
self.zoom_out.setFixedSize(30, 30)
out_icon = QIcon("icons/zoomOut.png")
self.zoom_out.setIcon(out_icon)
self.zoom_out.setIconSize(QSize(30, 30))
w = QWidget(self)
layout = QHBoxLayout()
layout.addWidget(self.open_file)
layout.addWidget(self.zoom_in)
layout.addWidget(self.zoom_out)
layout.setAlignment(Qt.AlignLeft)
w.setLayout(layout)
w.setFixedSize(300, 50)
self.box = ImageBox()
self.box.setFixedSize(500,500)
layout = QVBoxLayout()
layout.addWidget(w)
layout.addWidget(self.box)
self.setLayout(layout)
def open_image(self):
"""
select image file and open it
:return:
"""
# img_name, _ = QFileDialog.getOpenFileName(self, "打开图片", "", "All Files(*);;*.jpg;;*.png")
img_name, _ = QFileDialog.getOpenFileName(self, "Open Image File","","All Files(*);;*.jpg;;*.png;;*.jpeg")
self.box.set_image(img_name)
def large_click(self):
"""
used to enlarge image
:return:
"""
if self.box.scale < 2:
self.box.scale += 0.1
self.box.adjustSize()
self.update()
def small_click(self):
"""
used to reduce image
:return:
"""
if self.box.scale > 0.3:
self.box.scale -= 0.2
self.box.adjustSize()
self.update()
if __name__ == '__main__':
app = QApplication(sys.argv)
box = MainDemo()
box.show()
app.exec_()
这个代码写的过于匆忙,如果你有Pyqt5相关的系统性的学习资料的话,请在评论区留言,不胜感激!!