Установка цветов рисунка и толщины линий в QtCore.Qt.CrossPattern

Я использую следующее в начале моего QtGui.QGraphicsView сделать красивую сетку / крест узор. Но не знаете, как изменить цвет фона или толщину линий перекрестного рисунка? С помощью setColor установить цвет, но это только меняет цвет crossPattern, а не фон.

Есть ли способ изменить это, или я должен использовать другой тип стиля?

import PySide.QtGui as QtGui
import PySide.QtCore as QtCore

class NodeGraphView(QtGui.QGraphicsView):

    def __init__(self, parent):
        super(NodeGraphView, self).__init__(parent)

        self.fg_brush = QtGui.QBrush()
        self.fg_brush.setStyle(QtCore.Qt.CrossPattern)
        self.fg_brush.setColor(QtGui.QColor(42, 42, 42, 255))

        self.setBackgroundBrush(self.fg_brush)

2 ответа

Решение

Вид фона в основном только для "заливки"; шаблон креста очень простой и не настраиваемый (кроме цвета, потому что это базовое свойство заливки). Но это не сложно нарисовать вашу собственную сетку, и тогда у вас будет гораздо больше контроля (например, толщина, пунктир / пунктир, показ источника и т. Д.):

  • создать ручку для линий сетки: придать ей цвет и ширину
  • Вы можете настроить перо на постоянную "косметическую" ширину; в этом случае он не будет масштабироваться
  • добавить строки в сцену
  • установить линии для наименьшего значения z, чтобы они рисовались раньше всего

Пример:

from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QPen
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView

scale_fac = 1

def scale():
    global scale_fac
    scale_fac = scale_fac * 1.5
    view.scale(scale_fac, scale_fac)

app = QApplication([])

scene = QGraphicsScene()
pen = QPen(Qt.red)
pen.setCosmetic(True)  # ***
for x in range(0, 500, 50):
    line = scene.addLine( x, 0, x, 500, pen)
    line.setZValue(-10)
for y in range(0, 500, 50):
    scene.addLine( 0, y, 500, y, pen)
    line.setZValue(-10)

view = QGraphicsView()
view.setScene(scene)
view.show()

QTimer.singleShot(1000, scale)
QTimer.singleShot(2000, scale)
QTimer.singleShot(3000, scale)
app.exec()

Если setCosmetic(True) не выдается, толщина линии будет увеличиваться при увеличении.

Хорошая вещь с вышеупомянутым - то, что линии находятся в фиксированной координате в сцене. Однако, если вы уменьшите масштаб, вам, возможно, придется добавить больше строк или сделать существующие строки длиннее. Вы можете сделать это, переопределив сцену drawBackground(), который вызывается с прямоугольником видимой сцены: там вы настраиваете конечные точки линии.

Хм, нашел, я также могу установить цвет фона, не влияя на сетку с помощью:

    self.setObjectName("QGraphicsView")
    frame_css = '''
     QGraphicsView#QGraphicsView {
         background-color: rgb(42,42,42);
     }
     '''

    self.setStyleSheet(frame_css)
Другие вопросы по тегам