Не пойму как работает метод рисования линий PyQt draw lines

Рейтинг: -1Ответов: 1Опубликовано: 03.08.2023

Рисую поле расчерченое в клетку. Нарисовал косую линию. Получилось норм.
Далее решил разлиновать поле. И тут сел.
Подскажите где я накосячил?

import math
import sys
from PyQt5.uic import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QPainter, QPen
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self._COLOR_BACKGROUND = QColor("#363636")
        self.initUI()

    def initUI(self):
        self.GRID_SIZE = 20
        self._color_light = QColor("#2f2f2f")
        self._color_dark = QColor("#292929")

        self._pen_light = QPen(self._color_light)
        self._pen_light.setWidth(1)
        self._pen_dark = QPen(self._color_dark)
        self._pen_dark.setWidth(2)

        self.setWindowTitle("Node")
        self.setGeometry(0,0,400,200)
        self.scene_width, self.scene_height = 64000, 64000
        self.layout = QVBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.layout)
        self.grScene = QGraphicsScene()
        self.view = QGraphicsView()
        self.view.setBackgroundBrush(self._COLOR_BACKGROUND)
        self.layout.addWidget(self.view)
        self.view.setScene(self.grScene)
        self.grScene.addLine(0,0,100, 200)
        self.painter = QPainter()

        lines_light, lines_dark = [], []
        for x in range(0, self.scene_width, self.GRID_SIZE):
            lines_light.append(QLine(x, 0, x, self.scene_width))
        print(*lines_light)
        self.painter.setPen(self._pen_light)
        self.painter.drawLines(*lines_light)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = Window()
    w.show()

    app.exec()

Ответы

▲ 1

Я не уверен что правильно понимаю то, что вы хотели сделать. Но вы пытались рисовать под сценой.

Я немного изменил ваш код чтобы вы увидели где происходит рисование и добавил класс View(), как один из вариантов того что вы хотите сделать.

import sys
import math
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class View(QtWidgets.QGraphicsView):
    def __init__(self):
        super().__init__()
        
        scene = QtWidgets.QGraphicsScene()
        self.setScene(scene)
        self.setRenderHints(QtGui.QPainter.Antialiasing)
        scene.setSceneRect(0, 0, 1024, 768)

        texture = QtGui.QImage(20, 20, QtGui.QImage.Format_ARGB32)
        qp = QtGui.QPainter(texture)
        qp.setBrush(QtCore.Qt.white)
        qp.setPen(QtGui.QPen(QtGui.QColor(189, 190, 191), 2))
        qp.drawRect(texture.rect())
        qp.end()
        scene.setBackgroundBrush(QtGui.QBrush(texture))

        self._color_dark = QColor("#2929f9")
        self._pen_dark = QPen(self._color_dark)
        self._pen_dark.setWidth(2)        
        scene.addLine(0, 0, 100, 200, self._pen_dark)


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self._COLOR_BACKGROUND = QColor("#367636")
        self.initUI()

    def initUI(self):
        self.GRID_SIZE = 20
        self._color_light = QColor("#ff2f2f")
        self._color_dark = QColor("#2929f9")

        self._pen_light = QPen(self._color_light)
        self._pen_light.setWidth(2)
        self._pen_dark = QPen(self._color_dark)
        self._pen_dark.setWidth(2)

        self.setWindowTitle("Node")
#        self.setGeometry(0, 0, 400, 200)
        self.scene_width, self.scene_height = 64000, 64000
        
        self.layout = QVBoxLayout()
# !!!
        self.layout.setContentsMargins(40, 40, 40, 40)       # ! изменил для визуализации

        self.setLayout(self.layout)
        
        self.grScene = QGraphicsScene()
        self.view = QGraphicsView()
        self.view.setBackgroundBrush(self._COLOR_BACKGROUND)
        self.layout.addWidget(self.view, 1)
        self.view.setScene(self.grScene)
#                                                    ?        
        self.grScene.addLine(0, 0, 100, 200, self._pen_light)
        
# !!!        
        self.view2 = View()                                 # ! добавил для визуализации        
        self.layout.addWidget(self.view2, 1)                # ! добавил для визуализации 
# !!!
# +++ vvvvvvvvvvvvvvv это ваше  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def paintEvent(self, e):
        painter = QPainter()
        painter.begin(self)
        self.drawLines(painter)
        painter.end()    
    
    def drawLines(self, painter):
#        lines_light, lines_dark = [], []
        painter.setPen(self._pen_light)
        for x in range(0, self.scene_width, self.GRID_SIZE):
#            lines_light.append(QLine(x, 0, x, self.scene_width))
            
            painter.drawLine(x, 0, x, self.scene_width)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^         
     

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = Window()
    w.resize(500, 500)
    w.show()

    app.exec()

введите сюда описание изображения