2017-01-02 1 views
2

J'utilise ce qui suit dans l'init de mon QtGui.QGraphicsView pour créer un motif grille/croix sympa. Mais vous ne savez pas comment changer la couleur d'arrière-plan ou l'épaisseur des lignes en forme de croix? En utilisant setColor pour définir la couleur, mais cela ne change que la couleur du crossPattern et non l'arrière-plan.Définition des couleurs de motif et de l'épaisseur de ligne sur QtCore.Qt.CrossPattern

Existe-t-il un moyen de les modifier, ou devrais-je utiliser un type de style différent?

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) 

Répondre

2

L'arrière-plan de vue est fondamentalement juste pour le "remplissage"; le motif en croix est très basique et non configurable (autre que la couleur, car c'est la propriété de remplissage de base). Mais il est difficile de ne pas dessiner votre propre grille, puis vous avez beaucoup plus de contrôle (telles que l'épaisseur, pointillés/en pointillés, l'origine montrant, etc.):

  • créer un stylo pour les lignes de la grille: lui donner la couleur et la largeur
  • Vous pouvez définir le stylo pour avoir une largeur "cosmétique" constante; dans ce cas, il ne sera pas l'échelle
  • ajouter des lignes à la scène
  • les lignes de jeu pour avoir la plus faible valeur de z ils sont attirés avant tout le reste

Exemple:

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() 

Si setCosmetic(True) n'est pas émise, l'épaisseur de la ligne augmentera à mesure que vous zoomez.

La bonne chose avec ce qui précède est que les lignes sont à une coordonnée fixe dans la scène. Cependant, si vous effectuez un zoom arrière, vous devrez peut-être ajouter plus de lignes ou allonger les lignes existantes. Vous pouvez le faire en remplaçant le drawBackground() de la scène, qui est appelé avec le rect de la scène qui est en vue: là, vous ajustez les extrémités de la ligne.

0

Hmm, trouvé que je peux également définir la couleur d'arrière-plan sans affecter la grille avec:

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

    self.setStyleSheet(frame_css)