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에 포함시켜 응용 프로그램으로 작동 할 수 있는지 말해 줄 수 있습니까? 당신 클래스 테스트에서
여기서 'MyCanvas'클래스의 코드는 무엇입니까? – alexisdm
죄송합니다. 잘못된 코드를 붙여 넣었습니다. 결정된. – cledith