2016-12-08 21 views
1

У меня проблема с краской и рисунком QGraphicsView/Scene. Я рисую кучу QLineF as background overriding QGraphicsView :: drawBackGround`. Однако, когда я пытаюсь изменить цвет фона, ничего не происходит.Картина на QGraphicsView с использованием drawBackground

Вот минимальный пример того, что я делаю:

import sys 
import platform 
import ctypes 
from PySide import QtCore, QtGui 
from mygv import Ui_Dialog 
import sys 

class myView(QtGui.QDialog): 
    def __init__(self, parent = None): 
     QtGui.QDialog.__init__(self, parent) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 
     self.ui.view.drawBackground = self.drawBackground 
     self.ui.view.wheelEvent = self.wheelEvent 
     self.scene = QtGui.QGraphicsScene() 
     self.ui.view.setScene(self.scene) 
     self.scene.addEllipse(0,0,100,100) 

    def drawBackground(self, painter, rect): 

     bbrush = QtGui.QBrush(QtGui.QColor(255,170,255), QtCore.Qt.SolidPattern) 
     painter.setBackgroundMode(QtCore.Qt.OpaqueMode) 

     pen = QtGui.QPen(QtGui.QColor(46, 84, 255)) 
     pen.setWidth(5) 
     painter.setPen(pen) 

     line1 = QtCore.QLineF(0,0,0,100) 
     line2 = QtCore.QLineF(0,100,100,100) 
     line3 = QtCore.QLineF(100,100,100,0) 
     line4 = QtCore.QLineF(100,0,0,0) 
     painter.setBackground(bbrush) 
     painter.drawLines([line1, line2, line3, line4]) 




    def wheelEvent(self,event): 
     factor = 1.41 ** (event.delta()/240.0) 
     self.ui.view.scale(factor, factor) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    diag = myView() 
    diag.show() 
    diag.ui.view.centerOn(50,50) 
    app.exec_() 

Ui_dialog просто стандартный диалог генерируется из QDesigner с членом QGraphicsView под названием «Вид».

Это просто пример проблемы. Мне нужно иметь возможность менять цвет фона систематически во время выполнения моего приложения.

Что мне не хватает или делает (явно) неправильно?

ответ

1

setBackground метод QPainter не заполняет фон, но указывает только фон для операций, таких как рисование непрозрачного текста, штриховых линий и растровых изображений (см. Раздел documentation).

Вы можете использовать fillRect вместо этого, чтобы заполнить прямоугольник размера вашей области с помощью кисти, указанной вами.

Пример:

import sys 
from PyQt5 import QtCore, QtWidgets, QtGui 

class myView(QtWidgets.QGraphicsView): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def drawBackground(self, painter, rect): 

     background_brush = QtGui.QBrush(QtGui.QColor(255,170,255), QtCore.Qt.SolidPattern) 
     painter.fillRect(rect, background_brush) 

     pen = QtGui.QPen(QtGui.QColor(46, 84, 255)) 
     pen.setWidth(5) 
     painter.setPen(pen) 

     line1 = QtCore.QLineF(0,0,0,100) 
     line2 = QtCore.QLineF(0,100,100,100) 
     line3 = QtCore.QLineF(100,100,100,0) 
     line4 = QtCore.QLineF(100,0,0,0) 
     painter.drawLines([line1, line2, line3, line4]) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 

    scene = QtWidgets.QGraphicsScene() 
    scene.addEllipse(0,0,100,100) 

    view = myView(scene) 
    view.show() 
    view.centerOn(50,50) 

    app.exec_() 

Он использует PyQt5, но достаточно прост для понимания.

Результат:

enter image description here

показывает хороший пурпурный цвет, указанный.

+0

спасибо! Он работает как ожидалось !! – user20679

 Смежные вопросы

  • Нет связанных вопросов^_^