gpt4 book ai didi

python - 如何在布局中间插入 QWidgets?

转载 作者:行者123 更新时间:2023-12-04 03:14:48 24 4
gpt4 key购买 nike

我正在使用 Qt 框架来构建我的图形用户界面。我使用 QGridLayout 来整齐地定位我的 QWidget。
GUI 如下所示:

enter image description here

我的应用程序会在运行时定期向 GUI 添加新的小部件。这些新的小部件通常不会添加在 QLayout 的末尾,而是在中间的某个地方。

这样做的过程有点麻烦。应用上图,我需要取出 widg_C , widg_D , ... 来自 QGridLayout。接下来,我添加 widg_xwidg_y ,最后我又把其他小部件放回去了。
这是我从 QGridLayout 中删除小部件的方式:

for i in reversed(range(myGridLayout.count())):
self.itemAt(i).widget().setParent(None)
###

只要您处理少量小部件,此过程就不是灾难。但是在我的应用程序中,我显示了很多小部件 - 可能有 50 个或更多!在此过程进行时,应用程序会卡住一秒钟,这对用户来说非常烦人。
有没有办法在 QLayout 的某处插入小部件,而无需取出其他小部件?

编辑:显然 QVBoxLayout 的解决方案非常简单。只需使用功能 insertWidget(..)而不是 addWidget(..) .可以通过以下链接找到文档: http://doc.qt.io/qt-5/qboxlayout.html#insertWidget
不幸的是,我找不到 QGridLayout 的类似功能。

编辑:许多人正确地提到,放回大量小部件不应该导致性能问题 - 它确实非常快(感谢@ekhumoro 指出这一点)。显然,我面临的性能问题与将小部件放回原处的算法有关。这是一个相当复杂的递归算法,它将每个小部件放在 QGridLayout 中的正确坐标上。这导致我的显示器出现“闪烁”。小部件被取出,并在一些延迟后放回内部(由于算法) - 导致闪烁。

编辑:我找到了一个解决方案,这样我就可以轻松地将新行插入 QGridLayout。插入新行意味着我不需要从头开始取出和替换所有小部件 - 因此我避免了运行昂贵的递归算法。
解决方案可以在我下面的答案中找到。

最佳答案

谢谢@ekhumoro、@Stuart Fisher、@vahancho 和@mbjoe 的帮助。我最终找到了解决问题的方法。我不再使用 QGridLayout() .相反,我围绕 QVBoxLayout 构建了一个包装器。表现得好像它是一个 GridLayout,有一个额外的功能来插入新行:

class CustomGridLayout(QVBoxLayout):
def __init__(self):
super(CustomGridLayout, self).__init__()
self.setAlignment(Qt.AlignTop) # !!!
self.setSpacing(20)


def addWidget(self, widget, row, col):
# 1. How many horizontal layouts (rows) are present?
horLaysNr = self.count()

# 2. Add rows if necessary
if row < horLaysNr:
pass
else:
while row >= horLaysNr:
lyt = QHBoxLayout()
lyt.setAlignment(Qt.AlignLeft)
self.addLayout(lyt)
horLaysNr = self.count()
###
###

# 3. Insert the widget at specified column
self.itemAt(row).insertWidget(col, widget)

''''''

def insertRow(self, row):
lyt = QHBoxLayout()
lyt.setAlignment(Qt.AlignLeft)
self.insertLayout(row, lyt)

''''''

def deleteRow(self, row):
for j in reversed(range(self.itemAt(row).count())):
self.itemAt(row).itemAt(j).widget().setParent(None)
###
self.itemAt(row).setParent(None)

def clear(self):
for i in reversed(range(self.count())):
for j in reversed(range(self.itemAt(i).count())):
self.itemAt(i).itemAt(j).widget().setParent(None)
###
###
for i in reversed(range(self.count())):
self.itemAt(i).setParent(None)
###

''''''

关于python - 如何在布局中间插入 QWidgets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42084879/

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