2011-08-29 2 views
1

qt 디자이너에서 위젯을 생성하고 pyuic을 사용하여 Ui_wid_canvas라는 python 클래스로 위젯 파일을 변환했습니다. 이 특수 캔버스로 사용하도록되어 : 나는 클래스 MyCanvas을 유도 Ui_wid_canvas에서PyQt Child 위젯이 paintEvent를 수신하지 않습니다

# file mgcanvas.py 
from PyQt4 import QtCore, QtGui 

class Ui_wid_canvas(object): 
    def setupUi(self, wid_canvas): 
     wid_canvas.setObjectName("wid_canvas") 
     wid_canvas.resize(400, 300) 
     self.horizontalLayout = QtGui.QHBoxLayout(wid_canvas) 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     self.pushButton = QtGui.QPushButton(wid_canvas) 
     self.pushButton.setObjectName("pushButton") 
     self.horizontalLayout.addWidget(self.pushButton) 

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

    def retranslateUi(self, wid_canvas): 
     wid_canvas.setWindowTitle(QtGui.QApplication.translate("wid_canvas", "Form", None, QtGui.QApplication.UnicodeUTF8)) 
     self.pushButton.setText(QtGui.QApplication.translate("wid_canvas", "PushButton", None, QtGui.QApplication.UnicodeUTF8)) 

는 paintEvent 기능과 몇 가지 유틸리티 기능을 같은 무()를 구현합니다. 성서 안에는 두 개의 직사각형이 그려집니다. 내 응용 프로그램으로 다음 클래스를 사용하면 모든 것이 매력처럼 작동합니다. 내가 MyCanvas (아래 참조)를 인스턴스화하는 응용 프로그램 테스트를 만들 때 이제

# file mycanvas.py 
from PyQt4 import QtCore, QtGui 
import mgcanvas 


class MyCanvas(mgcanvas.Ui_wid_canvas, QtGui.QWidget): 
    def __init__(self): 
     super(mgcanvas.Ui_wid_canvas, self).__init__() 
     self.setupUi(self) 

    def paintEvent(self, qpaintevent): 
     print "PaintEvent canvas" 
     painter = QtGui.QPainter(self) 
     painter.setBrush(QtGui.QColor(255,0,0,80)) 
     painter.setPen(QtGui.QColor(00,00,00,255)) 

     painter.drawRect(10,10,100,100) 
     r = QtCore.QRectF(110,110,100,100) 
     painter.drawRect(r) 
     painter.drawText(r,"Hello", QtGui.QTextOption(QtCore.Qt.AlignCenter)) 



    def moo(self): 
     print "This is canvas mooing" 

은 시험에 대한 paintEvent가 호출되지만 MyCanvcas에 대한 paintevent는의 구형이 그려되지 않고 출력 "Paintevent 캔버스"호출되지 않습니다 콘솔에. Test.paintevent()에서 self.widget.update() 또는 self.widget.redraw()을 호출하면 paintevent가 발견되지 않습니다. self.widget.paintevent()을 수동으로 호출하면 함수가 호출되지만 화가는 활성화되지 않습니다. 반면에 푸시 버튼은 위젯이 올바르게 포함되어있는 것으로 나타 났지만 페인트 위젯은 하위 위젯에 의해 호출되지 않습니다. 그것은 Mac과 Windows에서 작동하지 않습니다하지만 난 플랫폼 독립을 유지하고자하기 때문에 Qt.WA_PaintOutsidePaintEvent 설정

# file test.py; executed with `python test.py` 
    from PyQt4 import QtCore, QtGui 
    import mycanvas 

    class Test(object): 
     def setupUi(self, Gui): 
      self.counter = 0 
      Gui.setObjectName("TestObject") 
      Gui.resize(500,500) 
      self.layout = QtGui.QVBoxLayout() 
      self.widget = mycanvas.MyCanvas() 
      self.widget.setupUi(self) 
      self.widget.setObjectName("wid_canvas") 
      self.layout.addWidget(self.widget) 

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

     def retranslateUi(self, Gui): 
      Gui.setWindowTitle(QtGui.QApplication.translate("TestObject", "Title", None, QtGui.QApplication.UnicodeUTF8)) 


     def paintEvent(self, qpaintevent): 
      print "---> Enter" 
      self.counter += 1 
      print "counter", self.counter 
      self.widget.repaint() 
      self.widget.moo() 
      print "<-- Leave" 

    class MyTest(Test, QtGui.QWidget): 
     def __init__(self): 
      super(Test, self).__init__() 
      self.setupUi(self) 

    if __name__ == '__main__': 
     import sys 
     app = QtGui.QApplication(sys.argv) 
     ui = MyTest() 
     ui.show() 

     sys.exit(app.exec_()) 

이 옵션을 선택하지 않습니다.

많은 코드를 게시 해 주시면 실례지만 제 생각에는 쉽습니다. 나는 그것을 최소한으로 유지하려고 노력했다. 누군가가 내가 어떻게 위젯 MyCanvas 페인트를 그 자체로 가질 수 있는지 그리고이 위젯을 다른 위젯 인 MyTest에 포함시켜 응용 프로그램으로 작동 할 수 있는지 말해 줄 수 있습니까? 당신 클래스 테스트에서

+0

여기서 'MyCanvas'클래스의 코드는 무엇입니까? – alexisdm

+0

죄송합니다. 잘못된 코드를 붙여 넣었습니다. 결정된. – cledith

답변

1

, 당신은 QVBoxLayout에 매개 변수로 전달하여, 매개 변수 Gui에 레이아웃을 첨부하지 않았고, 이미 MyCanvas 생성자에 의해 호출되었지만 당신은 MyCanvas에 대한 self.widget.setupUi을했다.

class Test(object): 
    def setupUi(self, Gui): 
     self.counter = 0 
     Gui.setObjectName("TestObject") 
     Gui.resize(500,500) 
     self.layout = QtGui.QVBoxLayout(Gui) 
     self.widget = mycanvas.MyCanvas() 
     self.widget.setObjectName("wid_canvas") 
     self.layout.addWidget(self.widget) 

     self.retranslateUi(Gui) 
     QtCore.QMetaObject.connectSlotsByName(Gui) 
+0

예, 감사합니다. 그랬어! – cledith

관련 문제