私はそれがそこに実装されています方法を確認するためにVCLに潜っ。このフレームワークのコンセプトは、Qtとはまったく違っていて、役に立たずに私を間違った方向に向けるかもしれないというコンセプトのため、そうすることをお勧めしますか?しかし、この質問に対する回答の欠如は、私には、Qtの行動がこのようにうまくいかない可能性があることを示唆しています。これは残念です。
DelphiのVCLアクションは、イベントループでアプリケーションのアイドル時間に評価される中央リストに組み込まれて登録されます。これは、少なくとも私は、タイマーを使ってQtの中でエミュレートすることができたタイムアウト0で始まっそこで私は、この回避策に来る:
class HFClient(QMainWindow):
def updateAction(self, action):
action.setEnabled(False)
class ActionUpdater(QTimer):
def __init__(self):
super(ActionUpdater, self).__init__()
self.members = {}
self.timeout.connect(self.timerEvent)
def add(self, action, updateProc):
self.members[action] = updateProc
def remove(self, action):
del self.members[action]
def timerEvent(self, unused):
# prevent being the last one to keep the object alive:
done = [action for action in self.members if sys.getrefcount(action) < 5]
for action in done:
self.remove(action)
# call registered method:
for action, updateProc in self.members.items():
updateProc(action)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = HFClient()
w.show()
updater = ActionUpdater()
updater.start()
a = QAction("save as", app)
updater.add(a, w.updateAction)
# del a
app.exec()
メモリは言語は、オブジェクトが登録されていない持って少し難しいです再びときのプログラミング管理登録されたオブジェクトは終了します。あまりにも簡単に、オブジェクトはまだレジスタに参照を持っているため、生きています。私はrefcountとupdaterインスタンス内の参照の数を比較することでこれを回避しようとしました。私はこれに対してより良い方法を評価します。
自分自身を登録するQActionの子孫を作ることができます(更新のためのシグナルスロットの組み合わせかもしれません)。もちろん
class ActionUpdater(QTimer):
def __init__(self):
super(ActionUpdater, self).__init__()
self.members = []
self.timeout.connect(self.timerEvent)
def add(self, action):
self.members.append(weakref.ref(action, self.remove))
def remove(self, action):
self.members.remove(action)
def timerEvent(self, unused):
# call registered method:
for action in self.members:
action().getUpdated()
:
UPDATEは
は、従来の信号スロット機構を使用するには、上記のコードで参照カウントの問題を解決する
Weakrefs様作用から派生しますそれは年齢のQtで利用できます:http://doc.qt.io/qt-5/qobject.html#sender 'qobject_cast'を使って' sender() 'から' QAction'型を得ることができます。 「onContentChanging」はスロット機能でなければなりません。私はこれに答えを与えるだろうが、私はQt/C++だけを行う。 – AlexanderVX
@AlexanderVX OPは、最初のコード断片のようなものを望んでいます。** 2番目のコード断片ではありません。 –
私は間違いました。 SaveActionUpdateスロットの必要性があり、そこで送信者を処理することができます。 – AlexanderVX