出于某种原因,当 print(item.x(), item.y()) 时,控制台中会显示等于 0.0 0.0 的坐标。也许坐标显示的不是相对于场景,而是相对于项目本身的坐标?
import sys
from PyQt5.QtWidgets import (QGraphicsScene, QGraphicsView,
QMainWindow, QApplication, QGraphicsRectItem)
from PyQt5.QtCore import QRectF, QPointF, Qt
from PyQt5.QtGui import QTransform
class GraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
super(GraphicsScene, self).__init__(QRectF(-500, -500, 1000, 1000), parent)
self._start = QPointF()
self._current_rect_item = None
self.rects = []
k = 0
for i in range(50):
for j in range(50):
self.addRect(15 * i + 10, 15 * j + 10, 10, 10)
k += 1
def mousePressEvent(self, event):
clickecRect = self.itemAt(event.scenePos(), QTransform())
if clickecRect is not None:
clickecRect.setBrush(Qt.green)
if self.itemAt(event.scenePos(), QTransform()) is None:
self._current_rect_item = QGraphicsRectItem()
self.addItem(self._current_rect_item)
self._start = event.scenePos()
super(GraphicsScene, self).mousePressEvent(event)
def mouseMoveEvent(self, event):
if self._current_rect_item is not None:
r = QRectF(self._start, event.scenePos()).normalized()
self._current_rect_item.setRect(r)
super(GraphicsScene, self).mouseMoveEvent(event)
self._start.x()
self._start.y()
event.scenePos().x() - self._start.x()
event.scenePos().y() - self._start.y()
selected_items = self.items(r)
for rect in self.rects:
rect.setBrush(Qt.white)
self.rects.clear()
selected_items = selected_items[1:]
for item in selected_items:
item.setBrush(Qt.green)
self.rects.append(item)
print(item.x(), item.y())
def mouseReleaseEvent(self, event):
super(GraphicsScene, self).mouseReleaseEvent(event)
self.removeItem(self._current_rect_item)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
scene = GraphicsScene(self)
view = QGraphicsView(scene, self)
view.setSceneRect(0, 0, 1800, 2000)
view.setGeometry(0, 0, 1200, 800)
if __name__ == '__main__':
application = QApplication(sys.argv)
main_window = MainWindow()
main_window.setGeometry(100, 100, 600, 600)
main_window.show()
sys.exit(application.exec_())
找到了解决问题的方法。原来,对于items()方法从选中区域接收到的对象,需要调用rect()方法,返回对象。您可以调用此对象的 x()、y() 方法并获取坐标。这同样适用于 itemAt() 方法接收的对象。