raghava
raghava

Reputation: 177

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

Upvotes: 0

Views: 639

Answers (1)

eyllanesc
eyllanesc

Reputation: 244132

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)

Upvotes: 1

Related Questions