我正在编写参数编辑器小部件,从子小部件生成事件时出现问题。
小部件本身订阅子小部件的更改并转发上面的事件。
假设编辑器包含一对QLineEdit
:
class Editor(QWidget):
paramsChanged = Signal(str, str)
def __init__(self, parent= None):
super().__init__(parent)
self.__build_ui()
def __build_ui(self):
self.__a = QLineEdit()
self.__b = QLineEdit();
box = QVBoxLayout()
box.addWidget(self.__a)
box.addWidget(self.__b)
self.__a.textChanged.connect(self.__on_paramChanged)
self.__b.textChanged.connect(self.__on_paramChanged)
self.setLayout(box)
def __on_paramChanged(self):
self.paramsChanged.emit(self.__a.text(), self.__b.text())
def setParams(self, a, b):
self.__a.setText(a)
self.__b.setText(b)
当以编程方式设置值时,子小部件会生成“更改”事件。
editor.setParams("a", "b")
日志:
changed a
changed a b
实际上问题是:如何
在加载参数()期间Editor::setParams
禁用子小部件的事件生成?
完整的代码Python + PySide2
# -*- coding: utf-8 -*-
import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *
class Editor(QWidget):
paramsChanged = Signal(str, str)
def __init__(self, parent= None):
super().__init__(parent)
self.__build_ui()
def __build_ui(self):
self.__a = QLineEdit()
self.__b = QLineEdit();
box = QVBoxLayout()
box.addWidget(self.__a)
box.addWidget(self.__b)
self.__a.textChanged.connect(self.__on_paramChanged)
self.__b.textChanged.connect(self.__on_paramChanged)
self.setLayout(box)
def __on_paramChanged(self):
self.paramsChanged.emit(self.__a.text(), self.__b.text())
def setParams(self, a, b):
self.__a.setText(a)
self.__b.setText(b)
def on_change(a, b):
print("changed", a, b)
if __name__ == '__main__':
app = QApplication(sys.argv)
editor = Editor()
editor.paramsChanged.connect(on_change)
editor.show()
editor.setParams("a", "b")
sys.exit(app.exec_())
阻止来自 QObject 后代(包括小部件)的信号:
分别解除封锁:
除了亚历山大·切尔宁的回答
如果在应用锁时锁已经处于活动状态,则调用
object->blockSignals(false);
将释放它,这可能会破坏调用代码。例如:
调用代码
QObject::blockSignals
返回给定对象的前一个信号阻塞状态,允许恢复前一个状态。也就是需要修改方法的
MyObject::setValues
代码updateObject
:为了不忘记这一点,您可以使用辅助类
QSignalBlocker
。它的算法和使用方法让人想起
lock guard
示例
Python