0

レイアウトが更新される仕組み/トリガーがわかりません。私が作成した簡単な例では、ボタンのテキストはメソッド内でリアルタイムに更新されますが、「2 つのボタンが表示されるはずです」が正しく報告されていても、メソッドが完了するまでレイアウトは更新されません。レイアウト/ウィンドウにボタンをリアルタイムでレイアウトに追加するにはどうすればよいですか?

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_()

メソッド内に新しいボタンを表示する方法を説明または実演してください。

4

1 に答える 1

0

内でイベント ループを実行することはありませんaddButtonrepaintまたはを呼び出す必要はまったくありませんupdate。コントロールがイベント ループに戻るとすぐに、画面に新しいボタンが表示されます。

QCoreApplication.processEvents()概念実証として、 の代わりにを呼び出すようにコードを変更できますrepaint()。しかし、それでも悪いコードです。呼び出してはいけません。呼び出しsleepている間は、文字通りコード内で何も起こらないため、まったく無意味です。

基本的には、ボタンを追加してメソッドを終了するだけです。それが動作します。理由もなく物事を過度に複雑にしています。

于 2014-04-28T15:09:22.157 に答える