2017-01-02 21 views
2

Я использую следующее в начале моего QtGui.QGraphicsView, чтобы создать приятный сетку/кросс-шаблон. Но не знаете, как изменить цвет фона или толщину линий перекрестных рисунков? С помощью setColor установите цвет, но это только меняет цвет crossPattern, а не фон.Настройка цветов шаблонов и толщины линии на QtCore.Qt.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

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

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

Пример:

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() сцены, который вызывается с прямой сцены, которая находится в поле зрения: там вы настраиваете конечные точки линии.

0

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

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

    self.setStyleSheet(frame_css)