Search code examples
python-2.7pyqt4

How to to add x,y labels in QGraphicsview using pyqt4


Here is my sample program. When I need to draw a line for x axis and y label for y axis .so can any one please help me how to add a line and lables to scene.i tried different ways but i didn't get the proper output.So please help me how to add labels to scene.Give me any suggestion to solve this task.Thank you in advance.

Given bellow is my tried code:

import sys
from pyface.qt import QtGui, QtCore
# class ScanView(QtGui.QGraphicsView):
#     def __init__(self,X=5, Y=5,parent=None):
#         super(ScanView, self).__init__(parent)
class DemoApp(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(DemoApp, self).__init__()
        self.w= QtGui.QGridLayout()
        self.v= QtGui.QGraphicsView()
        self.w.addWidget(self.v)
        self.widget = QtGui.QWidget()
        self.widget.setLayout(self.w)
        self.setCentralWidget(self.widget)
        self._squares = []

        n_rows, n_cols = 3, 2
        squareLB = 50
        label = QtGui.QLabel("xaxis")
        label1 = QtGui.QLabel("yaxis")
        self._scene = QtGui.QGraphicsScene()
        mytext1 = QtGui.QGraphicsSimpleTextItem('label')
        self._scene.addItem(mytext1)
        mytext2 = QtGui.QGraphicsSimpleTextItem('label1')
        self._scene.addItem(mytext2)
        self.v.setScene(self._scene)

        self.pen = QtGui.QPen(QtCore.Qt.DotLine)
        self.pen.setColor(QtCore.Qt.red)

        width, height = (2 + 2)*squareLB, (3 + 2)*squareLB
        self._scene = QtGui.QGraphicsScene(0, 0, max(708, width), height)

        p = squareLB if width > 708 else (708.0-2*squareLB)/2.0

        for i in range(n_rows):
            for j in range(n_cols):
                it = self._scene.addRect(QtCore.QRectF(0,0,squareLB,squareLB),self.pen)
                it.setPos(p + j*squareLB, i*squareLB)

                self._squares.append(it)

        self.v.setScene(self._scene)
class Settings(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Settings, self).__init__(parent)

        self.folder = QtGui.QPushButton("Folder", clicked=self.showSettings)
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.folder)
        self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Light)
        hlay = QtGui.QHBoxLayout(central_widget)
        hlay.addLayout(vbox)
        hlay.addWidget(self.scrollArea)
        self.setGeometry(200, 100, 300, 300)
    def showSettings(self):
        self.view = DemoApp()
        self.newwidget = QtGui.QWidget()
        hlay = QtGui.QHBoxLayout(self.newwidget)
        hlay.addWidget(self.view)
        self.scrollArea.setWidget(self.newwidget)
def main():
    app = QtGui.QApplication(sys.argv)
    ex = Settings()
    ex.show()
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

enter image description here


Solution

  • You can use QpainterPath to draw the arrow and a little math to set the position:

    class DemoApp(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(DemoApp, self).__init__()
    
            self._squares = []
            n_rows, n_cols = 5, 4
            squareLB = 50
    
            self.widget = QtGui.QWidget()
            grid= QtGui.QGridLayout(self.widget)
            self.v = QtGui.QGraphicsView()
            grid.addWidget(self.v)
            self.setCentralWidget(self.widget)
    
            width, height = (2 + 2)*squareLB, (3 + 2)*squareLB
            self._scene = QtGui.QGraphicsScene(0, 0, max(708, width), height)
            self.v.setScene(self._scene)
    
            pen = QtGui.QPen(QtCore.Qt.red, 0.0, QtCore.Qt.DotLine)
            p = squareLB if width > 708 else (708.0-2*squareLB)/2.0
    
            for i in range(n_rows):
                for j in range(n_cols):
                    it = self._scene.addRect(QtCore.QRectF(0,0,squareLB,squareLB), pen)
                    it.setPos(p + j*squareLB, i*squareLB)
                    self._squares.append(it)
    
            path_x = QtGui.QPainterPath()
            path_x.lineTo(squareLB*n_cols/2, 0)
            path_x.lineTo(squareLB*n_cols/2 - 0.2*squareLB, -0.2*squareLB)
            path_x.lineTo(squareLB*n_cols/2, 0)
            path_x.lineTo(squareLB*n_cols/2 - 0.2*squareLB, +0.2*squareLB)
            pen = QtGui.QPen("green")
            pen.setWidth(2)
            item_path = self._scene.addPath(path_x, pen)
            item_path.setPos(p, (i+1.2)*squareLB)
            mytext1 = self._scene.addText("X")
            mytext1.setPos(p + j*squareLB/2, (i+1.2)*squareLB)
    
            path_y = QtGui.QPainterPath()
            path_y.lineTo(0, -squareLB*n_rows/2)
            path_y.lineTo(-0.2*squareLB, -squareLB*n_rows/2 + 0.2*squareLB)
            path_y.lineTo(0, -squareLB*n_rows/2)
            path_y.lineTo(+0.2*squareLB, -squareLB*n_rows/2 + 0.2*squareLB)
            pen = QtGui.QPen("red")
            pen.setWidth(2)
            item_path = self._scene.addPath(path_y, pen)
            item_path.setPos(p - 0.2*squareLB, (i+1)*squareLB)
            mytext1 = self._scene.addText("Y")
            mytext1.setPos(p - 0.7*squareLB, (i+1)*squareLB/2)