【问题标题】:Updating QGridLayout correctly when deleting some items and adding new [closed]删除某些项目并添加新项目时正确更新 QGridLayout [关闭]
【发布时间】:2019-12-15 08:25:49
【问题描述】:

我有一个 QGridLayout,我在启动时填充了一些 QLabels 和 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 的内容。

然后我执行以下操作以删除小部件,然后从布局中删除,同时保留我的标题(列标题)的第一行。

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 对象 text.parent() 返回 None。即使我尝试设置 text.setParent(self),它也会一直返回 None。

【问题讨论】:

  • 在不被否决的情况下提出问题变得如此困难......并非所有问题都简单易懂。

标签: python-2.7 qt layout pyqt qgridlayout


【解决方案1】:

我正在回答我自己的问题。我忘记了“不要尝试只在 MainThread 中更改 GUI”。就在去吃午饭之前,我意识到我已经忘记了这一点(又一次!)。我添加了一个简单的信号/插槽连接来跳转线程并且......它工作了。

self.s_set_names.connect(self.set_names)

【讨论】:

  • 您能否更好地澄清您最初所做的误导您的事情?您从未提到您在问题中使用了不同的线程。此外,此答案中提供的代码完全没有上下文,它无助于理解您最初是如何解决问题的。那是什么信号,它是如何/为什么/何时/由谁发出的?那个插槽是做什么的?
猜你喜欢
  • 2018-02-19
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多