【发布时间】:2021-09-18 13:14:52
【问题描述】:
我正在学习QGraphicsView。
self._item = QGraphicsPixmapItem()
self._item.setFlags(QGraphicsPixmapItem.ItemIsFocusable | QGraphicsPixmapItem.ItemIsMovable)
self._scene = QGraphicsScene(self)
self.graphicsView_1.setScene(self._scene)
self._scene.addItem(self._item)
self._item.setPixmap(QPixmap("image_path"))
我知道上面的序列是输出图片的方式。
第二行“QGraphicsPixmapItem.ItemIsMovable”这是鼠标选项。
我知道这样输出图片会用鼠标移动图片。
self._item = QGraphicsPixmapItem()
self._item.setFlags(QGraphicsPixmapItem.ItemIsFocusable | QGraphicsPixmapItem.ItemIsMovable)
self._scene = QGraphicsScene(self)
self.graphicsView_1.setScene(self._scene)
self.graphicsView_2.setScene(self._scene)
self._scene.addItem(self._item)
self._item.setPixmap(QPixmap("image_path"))
然后我制作了另一个 QGraphicsView 并应用了与 1 中相同的场景。
在这种情况下,如果您在一个 QGraphicsView 中单击并拖动鼠标,则会同时应用两者。
但是,这样做的缺点是必须观看相同的场景。
我想控制多个屏幕,同时输出不同的图片到QGraphicsView,但是有办法吗?图片不一样,但是放大、缩小、平移,我希望所有的QGraphicsview都拥有相同的控件。
我想同时控制两个不同的QGraphicsView。
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QRectF
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtGui import QPainter
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QGraphicsPixmapItem
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QGraphicsScene
from ui.preview_test import Ui_MainWindow
class mainwindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.graphicsView_1.setCursor(Qt.OpenHandCursor)
self.graphicsView_1.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_2.setCursor(Qt.OpenHandCursor)
self.graphicsView_2.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_1.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_1.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_2.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_2.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView_1.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing |
QPainter.SmoothPixmapTransform)
self.graphicsView_2.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing |
QPainter.SmoothPixmapTransform)
self.graphicsView_1.setBackgroundBrush(Qt.black)
self.graphicsView_2.setBackgroundBrush(Qt.black)
self._item = QGraphicsPixmapItem()
self._item.setFlags(QGraphicsPixmapItem.ItemIsFocusable |
QGraphicsPixmapItem.ItemIsMovable)
self._scene = QGraphicsScene(self)
self.graphicsView_1.setScene(self._scene)
self.graphicsView_2.setScene(self._scene)
self._scene.addItem(self._item)
self._delta = 0.1
self._item.setPixmap(QPixmap("C:/Users/wlxo0/Desktop/960x540 image.png"))
self.show()
def setBackground(self, color):
if isinstance(color, QColor):
self.graphicsView_1.setBackgroundBrush(color)
elif isinstance(color, (str, Qt.GlobalColor)):
color = QColor(color)
if color.isValid():
self.graphicsView_1.setBackgroundBrush(color)
def mouseMoveEvent(self, QMouseEvent):
self.mouse_x = QMouseEvent.x()
self.mouse_y = QMouseEvent.y()
print(f"X : {self.frame_2.x()} <= {self.mouse_x} <= {self.frame_2.x() + self.frame_2.width()-1}, Y : {self.frame_2.y()} <= {self.mouse_y} <= {self.frame_2.y() + self.frame_2.height()-1}")
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
self.zoomIn()
else:
self.zoomOut()
def zoomIn(self):
self.zoom(1 + self._delta)
def zoomOut(self):
self.zoom(1 - self._delta)
def zoom(self, factor):
_factor = self.graphicsView_1.transform().scale(
factor, factor).mapRect(QRectF(0, 0, 1, 1)).width()
_factor2 = self.graphicsView_2.transform().scale(
factor, factor).mapRect(QRectF(0, 0, 1, 1)).width()
if _factor < 0.07 or _factor > 100:
return
if _factor2 < 0.07 or _factor2 > 100:
return
self.graphicsView_1.scale(factor, factor)
self.graphicsView_2.scale(factor, factor)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = mainwindow()
app.exec_()
Original_Code我正在编辑我在 github 上找到的代码。
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.graphicsView_1 = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView_1.setObjectName("graphicsView_1")
self.horizontalLayout.addWidget(self.graphicsView_1)
self.graphicsView_2 = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView_2.setObjectName("graphicsView_2")
self.horizontalLayout.addWidget(self.graphicsView_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
UI 是使用 Qt Designer 创建的。
【问题讨论】:
-
您必须为每个视图使用不同的
QGraphicsScene实例。然后手动同步您想要匹配的部分,例如缩放和位置。
标签: python pyqt qgraphicsview