PyQt的:在的QGraphicsView
问题描述:
鼠标事件,我想用Python语言编写一个简单的程序与PyQt的。PyQt的:在的QGraphicsView
我有一个QGraphicsScene,我想做到以下几点: 有2个选项使用两个单选按钮:
- 对于生成点。这样,如果有人点击该场景,椭圆将出现。
- 用于选择点。这样,如果有人点击某个点,所选点将被返回。
我还挺新在PyQt的以及在GUI编程。我的主要问题是我不太了解Qt中的鼠标事件是如何工作的。 如果有人如此善良耐心地向我解释鼠标事件的基础知识,并为上述问题提供了一些解决方案,我将非常感激。
我附上图片太,以可视化的问题。
我试图做的问题。为了放置我使用Qt Designer的小部件,然后创建了一个名为SimpleWindow的子类。
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QPen, QBrush
from PyQt5.QtWidgets import QGraphicsScene
import points
class SimpleWindow(QtWidgets.QMainWindow, points.Ui_Dialog):
def __init__(self, parent=None):
super(SimpleWindow, self).__init__(parent)
self.setupUi(self)
self.graphicsView.scene = QGraphicsScene()
self.graphicsView.setScene(self.graphicsView.scene)
self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.graphicsView.mousePressEvent = self.pixelSelect
def pixelSelect(self, event):
pen = QPen(QtCore.Qt.black)
brush = QBrush(QtCore.Qt.black)
x = event.x()
y = event.y()
if self.radioButton.isChecked():
print(x, y)
self.graphicsView.scene.addEllipse(x, y, 4, 4, pen, brush)
if self.radioButton_2.isChecked():
print(x, y)
app = QtWidgets.QApplication(sys.argv)
form = SimpleWindow()
form.show()
app.exec_()
这是由设计器生成的类:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(538, 269)
self.graphicsView = QtWidgets.QGraphicsView(Dialog)
self.graphicsView.setGeometry(QtCore.QRect(130, 10, 371, 221))
self.graphicsView.setObjectName("graphicsView")
self.radioButton = QtWidgets.QRadioButton(Dialog)
self.radioButton.setGeometry(QtCore.QRect(20, 30, 82, 31))
self.radioButton.setObjectName("radioButton")
self.radioButton_2 = QtWidgets.QRadioButton(Dialog)
self.radioButton_2.setGeometry(QtCore.QRect(20, 80, 82, 17))
self.radioButton_2.setObjectName("radioButton_2")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.radioButton.setText(_translate("Dialog", "Generate"))
self.radioButton_2.setText(_translate("Dialog", "Select"))
谢谢。
答
在QGraphicsView
一个QGraphicsScene
加入,每一个管理不同坐标系统。该QGraphicsView
类似于相机和QGraphicsScene
类似于世界,当一个增加一个项目到现场就必须在它的坐标系。
如果您想在点击时添加项目,最好覆盖的mousePressEvent
方法,并获取使用scenePos()
方法的场景坐标中的位置。
另一件要做的事是初始化setSceneRect()
属性可以看到的空间。
如果使用多个按钮,建议使用QButtonGroup
,这些按钮映射按钮使得信号易于处理。
class GraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
QGraphicsScene.__init__(self, parent)
self.setSceneRect(-100, -100, 200, 200)
self.opt = ""
def setOption(self, opt):
self.opt = opt
def mousePressEvent(self, event):
pen = QPen(QtCore.Qt.black)
brush = QBrush(QtCore.Qt.black)
x = event.scenePos().x()
y = event.scenePos().y()
if self.opt == "Generate":
self.addEllipse(x, y, 4, 4, pen, brush)
elif self.opt == "Select":
print(x, y)
class SimpleWindow(QtWidgets.QMainWindow, points.Ui_Dialog):
def __init__(self, parent=None):
super(SimpleWindow, self).__init__(parent)
self.setupUi(self)
self.scene = GraphicsScene(self)
self.graphicsView.setScene(self.scene)
self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
group = QButtonGroup(self)
group.addButton(self.radioButton)
group.addButton(self.radioButton_2)
group.buttonClicked.connect(lambda btn: self.scene.setOption(btn.text()))
self.radioButton.setChecked(True)
self.scene.setOption(self.radioButton.text())
*选定的点将返回*的含义是什么? – eyllanesc
显示其坐标就足够了。 –
我建议您尝试解决它并告诉我们您尝试过的问题。关于这个问题,网上有很多信息,就在这里。 – eyllanesc