Python 如何在pyside的QWidget中使用update和paintEvent?

Python 如何在pyside的QWidget中使用update和paintEvent?,python,pyside,Python,Pyside,对于pyside来说,我还是个新手,在理解一些GUI概念时仍然有困难,即使是意识到体面 我有一个小部件,来自QWidget,我想在一个函数paintEvent中绘制它,这个函数被调用来绘制小部件(据我对文档的理解)。此外,应该使用方法update来更新小部件,该小部件调用方法paintEvent(据我对文档的理解) 在下面的代码框架中,我简要概述了我的代码,它应该做两件事: -初始化时,应绘制小部件 -如果需要,应该通过调用派生类中的update来重新绘制小部件 class MyWindow(Q

对于
pyside
来说,我还是个新手,在理解一些GUI概念时仍然有困难,即使是意识到体面

我有一个小部件,来自
QWidget
,我想在一个函数
paintEvent
中绘制它,这个函数被调用来绘制小部件(据我对文档的理解)。此外,应该使用方法
update
来更新小部件,该小部件调用方法
paintEvent
(据我对文档的理解)

在下面的代码框架中,我简要概述了我的代码,它应该做两件事: -初始化时,应绘制小部件 -如果需要,应该通过调用派生类中的
update
来重新绘制小部件

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.update() # update the widget for the first time

    def paintEvent(self, x):

        self.setGeometry(300, 200, 970, 450)
        self.setWindowTitle("My Window")
        ...
        self.table_model = MyTableModel(...)
        self.view =  QTableView()
        ...
        self.setLayout(layout)

    def do_something(self):
        ....
        self.update()
运行代码时,小部件按预期绘制。但是,一旦在
dou\u something
内部调用
update
,则不会重新绘制小部件!我还尝试使用方法
重新绘制
,但是小部件仍然没有重新绘制


如何通过调用
paintEvent

修复代码以确保小部件从头开始重新绘制?为什么要在
paintEvent
中构建GUI?!为什么需要覆盖
paintEvent
?您的小部件将自动显示并重新绘制自己。@Bartosz:也许我做的事情完全错了,但由于我对pyside很陌生,所以我仍然没有这个概述。将小部件作为其他小部件的一部分创建会更好吗?还是面板?还是主窗口?问题是,代码示例显示的数据位于我的应用程序的主小部件/窗口/面板/任何地方。如果我将此小部件作为主窗口的一部分,那么widget.update()会工作吗?在大多数情况下,不需要调用
widget.update()
。通常,您只需将布局添加到小部件中(
setLayout
在初始化方法中,而不是在
paintEvent
中),然后将其他子小部件添加到此布局。OS/Qt/pyside负责适当地重新绘制它们。但是OS/Qt/pyside如何知道何时重新绘制小部件呢?它如何知道数据库的内容已更改,因此需要重新绘制?定义所有绘图内容的合适方法是什么?我还应该把它们放进画展吗?或者其他方法?例如,当您更改文本框的文本时,它将知道需要刷新自身。您不需要定义绘图内容-小部件现在可以自己绘制了。要么您不了解大多数GUI库的工作原理,我建议您先学习一些简单的示例,要么您正在尝试实现更高级的东西,确实需要
paintEvent
——但您的问题并不清楚。