2017-01-02 259 views
2

我在我的QtGui.QGraphicsView的init中使用以下内容来制作一个很好的网格/交叉图案。但不知道如何更改交叉图案线条的背景颜色或厚度?使用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

视图背景基本上只是为了“填充”;十字图案非常基本,不可配置(除了颜色,因为这是基本的填充属性)。但是,绘制自己的网格并不难,然后你有更多的控制(如厚度,虚线/虚线,显示原点等):

  • 创建网格线笔:给它的颜色和宽度
  • 您可以将笔设置为具有恒定的“美观”宽度;在这种情况下,它不会扩展
  • 添加命令行来现场
  • 组行有最低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()来完成此操作,该场景通过观看场景的矩形进行调用:在那里调整线端点。

0

嗯,发现我也可以设置背景颜色,而不会影响网格:

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

    self.setStyleSheet(frame_css)