PyQt:QGraphicsView

时间:2017-09-23 17:04:52

标签: python pyqt pyqt5 qgraphicsview qgraphicsscene

我想用PyQt用Python编写一个简单的程序。

我有一个QGraphicsScene,我想做以下事情: 使用两个RadioButtons有两个选项:

  1. 用于生成积分。这样,如果有人点击场景,就会出现一个椭圆。
  2. 用于选择积分。这样,如果有人点击某个点,则会返回选定的点。
  3. 我在PyQt和GUI编程方面都是新手。我的主要问题是我真的不明白鼠标事件在Qt中是如何工作的。 如果某人如此善良和耐心地向我解释鼠标事件的基本知识并给我一些上述问题的窍门,我将非常感激。

    我也附上了一张照片,以便将问题直观化。 GUI

    我试图解决这个问题。为了放置小部件,我使用了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_()
    

    这是Designer生成的类:

    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"))
    

    谢谢。

1 个答案:

答案 0 :(得分:2)

QGraphicsView中添加QGraphicsScene,每个人都管理不同坐标的系统。 QGraphicsView类似于相机,而QGraphicsScene与世界类似,当一个项目添加到场景中时,它必须位于其坐标系中。

由于您要在点击时添加项目,最好覆盖mousePressEvent的{​​{1}}方法,并获取QGraphicsScene的场景坐标中的位置使用方法。

要做的另一件事是初始化属性scenePos(),这是setSceneRect()可以看到的空间。

如果使用多个按钮,建议使用QGraphicsView映射按钮,以便轻松处理信号。

QButtonGroup