gpt4 book ai didi

python - 创建父级后如何动态添加小部件

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:51 27 4
gpt4 key购买 nike

我正在尝试使用自定义小部件构建界面,但遇到了以下问题。

我有一个小部件 Rectangle我想在我的界面中用作交互元素。要定义一个矩形,我只需要给它一个父对象,这样它就知道要在哪个窗口中绘制自己,以及一个位置[x,y, width, height]。定义其位置和大小。 (我知道你们中的一些人会说“您应该使用布局而不是绝对定位”,但我 100% 确定我需要针对这个特定应用程序进行绝对定位)。

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class Rectangle(QWidget):

def __init__(self, parent, *args):
super(self.__class__,self).__init__(parent)

print parent, args
#expect args[0] is a list in the form [x,y,width,height]
self.setGeometry(*args[0])

def enterEvent(self, e):
print 'Enter'

def leaveEvent(self, e):
print 'Leave'

def paintEvent(self, e):

print 'Painted: ',self.pos
painter = QPainter(self)
painter.setPen(Qt.NoPen)
painter.setBrush(QColor(200,100,100))
painter.drawRect(0,0,self.width()-1, self.height()-1)
painter.end()

我还有一个 Window小部件,它是我的可视化要在其上绘制的 Canvas 。在Window__init__()定义 我在 20,40 处创建了一个矩形 A

class Window(QWidget):

def __init__(self):
super(self.__class__, self).__init__()


self.widgets = [Rectangle(self,[20,40,100,80])]
self.setMouseTracking(True)
self.setGeometry(300,300,800,600)
self.setWindowTitle('Window')
self.show()

def addWidget(self,Widget, *args):
self.widgets += [Widget(self, *args)]
self.update()

def mousePressEvent(self, e):
for widget in self.widgets:
print widget.geometry()

因为我正在构建可视化,所以我想创建我的 Window然后在后面添加小部件,所以我创建了一个实例 mWindow ,它应该已经定义了 rectangle A。然后我使用我的窗口的 addWidget()在 200,200 处添加第二个矩形的方法 - 称之为矩形 B

if __name__ == "__main__":
app= QApplication(sys.argv)

mWindow = Window()
mWindow.addWidget(Rectangle, [200,200,200,80])
sys.exit(app.exec_())

我遇到的问题是实际上只绘制了矩形A

我知道 rectangle A 和 **rectangle B 都被实例化了并且都有 myWindow作为它们的父部件,因为 print parent 的输出在 Rectangle 的构造函数中.

但是,当我调整窗口大小时强制它重新绘制自身时,paintEvent()方法仅在矩形 A 上调用,而不会在 矩形 B 上调用。我错过了什么?

最佳答案

你只是忘了显示矩形。在 addWidget 中,在 self.update() 之前添加:

self.widgets[-1].show()

第一个矩形对象不需要 show 的原因是因为它是在 Window 构造函数中创建。然后,Qt 本身确保对象正确显示(这是误导,我同意...)。

关于python - 创建父级后如何动态添加小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com