我在QtGui.QGraphicsView
的初始化中使用以下内容来制作一个漂亮的网格/交叉图案。但不确定如何更改十字图案线的背景颜色或粗细?使用setColor
设置颜色,但这只会更改交叉图案的颜色,而不会更改背景。
有没有办法改变这些,或者我应该使用不同类型的样式?
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)
视图背景基本上只是为了"填充";十字图案是非常基本的,不可配置(除了颜色,因为这是基本的填充属性)。但是绘制自己的网格并不难,然后您可以进行更多的控制(例如厚度,虚线/虚线,显示原点等):
- 为网格线创建笔:为其指定颜色和宽度
- 您可以将笔设置为具有恒定的"化妆品"宽度;在这种情况下,它不会缩放。
- 向场景添加线条
- 将线条设置为具有最低 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)