我不明白机制/触发器会导致布局更新。在我创建的简单示例中,按钮的文本在方法内实时更新,但布局在方法完成后才更新,即使"我应该看到2个按钮& #34;正确报告。如何让布局/窗口实时添加按钮到布局?
import sys
import time
from PySide import QtCore, QtGui
class Form(QtGui.QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.button = QtGui.QPushButton("Add")
self.newButton= QtGui.QPushButton("")
self.layout = QtGui.QVBoxLayout()
self.layout.addWidget(self.button)
self.setLayout(self.layout)
self.connect(self.button, QtCore.SIGNAL("clicked()"),self.addButton)
print()
def addButton(self):
self.button.setText("Clicked")
if self.layout.count() > 1:
self.layout.itemAt(1).widget().deleteLater()
self.repaint()
self.layout.update()
print("I should see " + str(self.layout.count()) + " button(s)")
time.sleep(3)
self.layout.addWidget(self.newButton)
self.repaint()
self.layout.update()
print("I should see " + str(self.layout.count()) + " button(s)")
time.sleep(3)
self.button.setText("")
self.button.setEnabled(False)
self.newButton.setText("New")
app = QtGui.QApplication(sys.argv)
a=Form()
a.show()
app.exec_()
请解释或演示如何在方法中显示新按钮。
答案 0 :(得分:0)
您永远不会在addButton
内运行事件循环。根本不需要致电repaint
或update
。一旦控件返回到事件循环,您就会在屏幕上看到新按钮。
作为概念验证,您的代码可以修改为调用QCoreApplication.processEvents()
而不是repaint()
。但是,这仍然是糟糕的代码。你不应该调用sleep
- 当你这样做时,你的代码中没有任何反应,所以它完全没有意义。
基本上,只需添加按钮并退出方法即可。它会工作。你无缘无故地过度复杂化了。