gpt4 book ai didi

python - 在 PyQt 中动态添加和删除小部件

转载 作者:太空狗 更新时间:2023-10-29 17:43:35 26 4
gpt4 key购买 nike

使用 PyQt,我正在尝试创建一个界面,我可以为其动态添加或删除小部件。我想为将要添加或删除的小部件定义一个单独的类。我似乎无法让我实例化的小部件显示在主界面中。这是我使用的代码:

from PyQt4 import QtGui, QtCore
import sys

class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)

# central widget
self.centralWidget = QtGui.QWidget(self)

# main layout
self.vLayout = QtGui.QVBoxLayout(self.centralWidget)

# main button
self.pButton_add = QtGui.QPushButton(self.centralWidget)
self.pButton_add.setText('button to add other widgets')

# scroll area
self.scrollArea = QtGui.QScrollArea(self.centralWidget)
self.scrollArea.setWidgetResizable(True)

# scroll area widget contents
self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)

# scroll area widget contents - layout
self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)

self.scrollArea.setWidget(self.scrollAreaWidgetContents)

# add all main to the main vLayout
self.vLayout.addWidget(self.pButton_add)
self.vLayout.addWidget(self.scrollArea)
# set central widget
self.setCentralWidget(self.centralWidget)
# connections
self.pButton_add.clicked.connect(self.addWidget)


def addWidget(self):
z = Test(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount()
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)


class Test(QtGui.QWidget):
def __init__( self, parent):
super(Test, self).__init__(parent)

self.pushButton = QtGui.QPushButton(self)


app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()

问题是,当我在我的“addWidget”方法中使用下面的代码时,它确实做了我想要它做的事情,但是类方法似乎不起作用。

z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)

我想知道为什么 z = Test() 没有产生任何结果?有任何想法吗?谢谢!

最佳答案

实际上,它确实有效。问题是,您的 Test 小部件有一个没有任何布局管理的 QPushButton。因此它无法在考虑按钮的情况下计算其 minimumSize。当您将该小部件放入布局中时,它只会缩小到 0(因为 QWidget 没有默认的 minimumSize)并且您看不到任何东西。

您有两种选择,要么手动管理布局并进入不必要的痛苦世界,要么依赖布局管理器。通常,您应该更喜欢后者。

我会像这样重写你的脚本(虽然我不确定你为什么使用QFormLayout,但我保持原样。):

from PyQt4 import QtGui, QtCore
import sys

class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)

# main button
self.addButton = QtGui.QPushButton('button to add other widgets')
self.addButton.clicked.connect(self.addWidget)

# scroll area widget contents - layout
self.scrollLayout = QtGui.QFormLayout()

# scroll area widget contents
self.scrollWidget = QtGui.QWidget()
self.scrollWidget.setLayout(self.scrollLayout)

# scroll area
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.scrollWidget)

# main layout
self.mainLayout = QtGui.QVBoxLayout()

# add all main to the main vLayout
self.mainLayout.addWidget(self.addButton)
self.mainLayout.addWidget(self.scrollArea)

# central widget
self.centralWidget = QtGui.QWidget()
self.centralWidget.setLayout(self.mainLayout)

# set central widget
self.setCentralWidget(self.centralWidget)

def addWidget(self):
self.scrollLayout.addRow(Test())


class Test(QtGui.QWidget):
def __init__( self, parent=None):
super(Test, self).__init__(parent)

self.pushButton = QtGui.QPushButton('I am in Test widget')

layout = QtGui.QHBoxLayout()
layout.addWidget(self.pushButton)
self.setLayout(layout)



app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()

关于python - 在 PyQt 中动态添加和删除小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651742/

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