2017-09-29 44 views
0

所以我有這個Ui_MainWindow類由pyuic5生成。如何繪製子部件?

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'MainWindow.ui' 
# 
# Created by: PyQt5 UI code generator 5.9 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 450) 
     self.centralWidget = QtWidgets.QWidget(MainWindow) 
     self.centralWidget.setObjectName("centralWidget") 
     self.canvas = QtWidgets.QWidget(self.centralWidget) 
     self.canvas.setGeometry(QtCore.QRect(70, 30, 621, 341)) 
     self.canvas.setAutoFillBackground(False) 
     self.canvas.setObjectName("canvas") 
     self.gview = QtWidgets.QGraphicsView(self.canvas) 
     self.gview.setGeometry(QtCore.QRect(80, 50, 256, 192)) 
     self.gview.setObjectName("gview") 
     MainWindow.setCentralWidget(self.centralWidget) 
     self.menuBar = QtWidgets.QMenuBar(MainWindow) 
     self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 22)) 
     self.menuBar.setObjectName("menuBar") 
     self.menuhola = QtWidgets.QMenu(self.menuBar) 
     self.menuhola.setObjectName("menuhola") 
     self.menust = QtWidgets.QMenu(self.menuBar) 
     self.menust.setObjectName("menust") 
     MainWindow.setMenuBar(self.menuBar) 
     self.menuBar.addAction(self.menuhola.menuAction()) 
     self.menuBar.addAction(self.menust.menuAction()) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.menuhola.setTitle(_translate("MainWindow", "hola")) 
     self.menust.setTitle(_translate("MainWindow", "splendid")) 

而且我想畫一些東西,只要它不是主窗口。但是,無論我嘗試什麼,它都不起作用。

這裏是我的代碼:

import sys 

from PyQt5 import QtWidgets 
from PyQt5.QtGui import QPainter 
from src.qt_design.main_window import Ui_MainWindow 


class SystemApp(QtWidgets.QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

    def paintEvent(self, event): 
     # Nope 
     painter = QPainter(self.ui.gview) 
     painter.drawLine(0, 0, 50, 50) 

     # Nope 
     painter = QPainter(self.ui.canvas) 
     painter.drawLine(0, 0, 50, 50) 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    window = SystemApp() 
    window.show() 
    sys.exit(app.exec_()) 

我不知道我是否應該: 1油漆與此父在其子(像上面我試過) 2.覆蓋兒童的paintEvent,但這可能是一個壞主意,請參閱here

任何幫助將不勝感激!

回答

0

你可以得到你正試圖與事件過濾器

class SystemApp(QtWidgets.QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.ui.gview.installEventFilter(self) 
     self.ui.canvas.installEventFilter(self) 

    def eventFilter(self, obj, e): 
     if e.type() == QtCore.QEvent.Paint: 
      painter = QPainter() 
      painter.begin(obj) 
      if obj == self.ui.canvas: 
       painter.setPen(QtCore.Qt.red) # Some specific painting 
      painter.drawLine(0, 0, 50, 50) 
      painter.end() 
      return True 
     return super().eventFilter(obj, e) 
完成的任務