删除某些项目并添加新项目时正确更新 QGridLayout
Updating QGridLayout correctly when deleting some items and adding new
我有一个 QGridLayout,我在启动时填充了一些 QLabel 和 QLineEdits。我的 QGridlayout 的第一行是列的标题。我用这个功能。
def add_row(self, idx, name, units, is_read_only=False):
row = idx + 1
# Add name
text = QLabel(name + ':', self)
text.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
col = 0
self.gridLayout.addWidget(text, row, col)
# Add read values
col = 1
self.read_values[name] = QLineEdit("", self)
self.read_values[name].setMinimumHeight(20)
#self.read_values[name].setMaximumWidth(260)
self.read_values[name].setMinimumWidth(150)
self.read_values[name].setReadOnly(True)
self.gridLayout.addWidget(self.read_values[name], row, col)
而且效果很好。
有时,我不得不删除 QGridLayout 的内容。
然后我执行以下操作以删除小部件,然后从布局中删除,同时保留我的 headers(列标题)所在的第一行。
def clear_grid_layout(self):
for i in reversed(range(self.gridLayout.count())):
row, col, d,e = self.gridLayout.getItemPosition(i)
if row == 0:
continue
widgetToRemove = self.gridLayout.itemAt(i).widget()
self.gridLayout.removeWidget(widgetToRemove)
widgetToRemove.deleteLater()
然后我需要添加一些小部件。它们应该都像第一次尝试时一样对齐(删除之前)。但是,当我尝试重新添加小部件时,我使用正确的参数重用了上面的相同函数,但它失败了。
此时我希望小部件出现在网格布局中,但它们是在实际软件之外创建的。
其他有用信息:当我检查时,QLabel object text.parent() returns None。即使我尝试设置 text.setParent(self),它也会一直返回 None.
我正在回答我自己的问题。我忘记了 "Do not try to change the GUI in nothing but the MainThread"。就在去吃午饭之前,我意识到我忘记了这件事(又一次!)。我添加了一个简单的 signal/slot 连接来跳转线程并且......它起作用了。
self.s_set_names.connect(self.set_names)
我有一个 QGridLayout,我在启动时填充了一些 QLabel 和 QLineEdits。我的 QGridlayout 的第一行是列的标题。我用这个功能。
def add_row(self, idx, name, units, is_read_only=False):
row = idx + 1
# Add name
text = QLabel(name + ':', self)
text.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
col = 0
self.gridLayout.addWidget(text, row, col)
# Add read values
col = 1
self.read_values[name] = QLineEdit("", self)
self.read_values[name].setMinimumHeight(20)
#self.read_values[name].setMaximumWidth(260)
self.read_values[name].setMinimumWidth(150)
self.read_values[name].setReadOnly(True)
self.gridLayout.addWidget(self.read_values[name], row, col)
而且效果很好。
有时,我不得不删除 QGridLayout 的内容。
然后我执行以下操作以删除小部件,然后从布局中删除,同时保留我的 headers(列标题)所在的第一行。
def clear_grid_layout(self):
for i in reversed(range(self.gridLayout.count())):
row, col, d,e = self.gridLayout.getItemPosition(i)
if row == 0:
continue
widgetToRemove = self.gridLayout.itemAt(i).widget()
self.gridLayout.removeWidget(widgetToRemove)
widgetToRemove.deleteLater()
然后我需要添加一些小部件。它们应该都像第一次尝试时一样对齐(删除之前)。但是,当我尝试重新添加小部件时,我使用正确的参数重用了上面的相同函数,但它失败了。
此时我希望小部件出现在网格布局中,但它们是在实际软件之外创建的。
其他有用信息:当我检查时,QLabel object text.parent() returns None。即使我尝试设置 text.setParent(self),它也会一直返回 None.
我正在回答我自己的问题。我忘记了 "Do not try to change the GUI in nothing but the MainThread"。就在去吃午饭之前,我意识到我忘记了这件事(又一次!)。我添加了一个简单的 signal/slot 连接来跳转线程并且......它起作用了。
self.s_set_names.connect(self.set_names)