Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PyQt子窗口小部件不接收paintEvent_Qt_Pyqt_Paintevent - Fatal编程技术网

PyQt子窗口小部件不接收paintEvent

PyQt子窗口小部件不接收paintEvent,qt,pyqt,paintevent,Qt,Pyqt,Paintevent,我在qt设计器中创建了一个小部件,并使用pyuic将ui文件转换为一个名为ui_wid_canvas的python类。这应该用作特殊画布: # file mgcanvas.py from PyQt4 import QtCore, QtGui class Ui_wid_canvas(object): def setupUi(self, wid_canvas): wid_canvas.setObjectName("wid_canvas") wid_canva

我在qt设计器中创建了一个小部件,并使用pyuic将ui文件转换为一个名为ui_wid_canvas的python类。这应该用作特殊画布:

# 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))
我从Ui_wid_canvas派生了一个类MyCanvas来实现paintEvent函数和一些实用函数,如moo()。在paintevent中,它所要做的就是画两个矩形。如果我使用下面的类作为我的应用程序,那么一切都像一个符咒

# 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"
现在,当我创建一个实例化MyCanvas的应用程序测试(见下文)时,将调用测试的paintEvent,但从未调用MyCanvcas的paintEvent,不会绘制矩形,也不会在控制台上输出“paintEvent Canvas”。如果在Test.paintevent()中调用
self.widget.update()
self.widget.redraw()
,则不会捕获paintevent。如果我手动调用self.widget.paintevent(),则会调用该函数,但不会激活画师。另一方面,显示的是按钮,从中我可以看出小部件被正确地包含,但子小部件并没有调用绘制事件

    # 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_())
#文件test.py;使用“python test.py”执行`
从PyQt4导入QtCore、QtGui
导入mycanvas
类别测试(对象):
def设置UI(自我,Gui):
self.counter=0
setObjectName(“TestObject”)
Gui.resize(500500)
self.layout=QtGui.QVBoxLayout()
self.widget=mycanvas.mycanvas()
self.widget.setupUi(self)
self.widget.setObjectName(“wid_画布”)
self.layout.addWidget(self.widget)
自重传(Gui)
QtCore.QMetaObject.connectSlotsByName(Gui)
def重新传输(自身、Gui):
setWindowTitle(QtGui.QApplication.translate(“TestObject”,“Title”,None,QtGui.QApplication.UnicodeUTF8))
def paintEvent(自我、qpaintevent):
打印“-->Enter”
self.counter+=1
打印“计数器”,自我计数器
self.widget.repaint()
self.widget.moo()

打印“在您的类测试中,您没有将布局作为参数传递给QVBoxLayout,从而将布局附加到参数
Gui
,并且您调用了
self.widget.setupUi
,用于
MyCanvas
,尽管
MyCanvas
构造函数已经调用了它

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)

在您的类测试中,您没有通过将布局作为参数传递给QVBoxLayout来将布局附加到参数
Gui
,并且您为
MyCanvas
调用了
self.widget.setupUi
,尽管它已经被
MyCanvas
构造函数调用

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)

MyCanvas
的代码在哪里?抱歉,粘贴了错误的代码。已修复。类
MyCanvas
的代码在哪里?抱歉,粘贴了错误的代码。已修复。