PySide2 clearSelection会触发itemSelectionChanged,如果避免触发

338 阅读1分钟

如果您希望在调用 clearSelection() 方法时避免触发 itemSelectionChanged 信号,您可以使用 blockSignals(True) 方法来暂时阻塞信号的发射,然后再调用 clearSelection() 方法,最后使用 blockSignals(False) 方法解除信号的阻塞。

以下是一个示例,演示如何避免在调用 clearSelection() 方法时触发 itemSelectionChanged 信号:

from PySide2.QtWidgets import QApplication, QListWidget, QMainWindow, QPushButton, QVBoxLayout, QWidget
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.list_widget = QListWidget()
        self.list_widget.addItem("Item 1")
        self.list_widget.addItem("Item 2")
        self.list_widget.itemSelectionChanged.connect(self.handle_item_selection_changed)

        self.clear_button = QPushButton("Clear Selection")
        self.clear_button.clicked.connect(self.clear_selection)

        layout = QVBoxLayout()
        layout.addWidget(self.list_widget)
        layout.addWidget(self.clear_button)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def handle_item_selection_changed(self):
        selected_items = self.list_widget.selectedItems()
        for item in selected_items:
            print("Selected Item:", item.text())

    def clear_selection(self):
        self.list_widget.blockSignals(True)  # 阻塞信号发射
        self.list_widget.clearSelection()
        self.list_widget.blockSignals(False)  # 解除信号阻塞

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在上述示例中,我们在 clear_selection 槽函数中使用 blockSignals(True) 方法来阻塞 list_widget 的信号发射。

然后,我们调用 clearSelection() 方法来清除 list_widget 中所有项的选中状态。

最后,我们使用 blockSignals(False) 方法来解除信号的阻塞,以便在之后的选中操作中继续触发 itemSelectionChanged 信号。

这样,在调用 clearSelection() 方法时,itemSelectionChanged 信号将被暂时阻塞,避免触发该信号。