我在Ui中建立了将项目添加到QtreeWidget并使用以下QtreeWidget.setItemWidget(...)
设置项目的显示窗口部件的位置。
为项目设置的显示小部件还有其他小部件,包括按钮,水平滑块,复选框,组合框。如何访问与项目小部件中的小部件(复选框,水平滑块等)进行交互而生成的事件?
QtreeWidget提供的信号仅允许与QWidgetItem交互,而不能与其中的控件交互。
实施QtreeWidget.eventFilter(...)
并不是一个好选择,因为我有多个要与之交互的小部件并且捕获了许多我不感兴趣的事件/信号。
我的问题很简单。如何访问通过移动水平滑块或单击按钮生成的事件/信号?
您可以像平常一样连接信号和插槽。小部件是否位于QTreeWidget中并不重要。
class Template(QWidget):
def __init__(self):
super().__init__()
tree = QTreeWidget()
tree.setColumnCount(2)
item = QTreeWidgetItem(tree)
item.setText(0, 'Item 1')
child = QTreeWidgetItem(item)
child.setText(0, 'Item 1a')
cb = QCheckBox('CheckBox')
cb.toggled[bool].connect(self.do_something)
slider = QSlider(Qt.Horizontal)
slider.valueChanged[int].connect(self.something_else)
tree.setItemWidget(item, 1, cb)
tree.setItemWidget(child, 1, slider)
vbox = QVBoxLayout(self)
vbox.addWidget(tree)
def do_something(self, state):
print(state)
def something_else(self, value):
print(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = Template()
gui.show()
sys.exit(app.exec_())
Events具有target()方法,该方法返回发生事件的对象。事件沿对象树传播。编写事件处理程序并按对象进行过滤。
Signals可以连接到任何地方,您只需要访问发出信号的对象(即指向该对象的指针)即可。
在您的情况下,请按照Alec的建议进行操作并连接信号,除非您需要诸如按下的鼠标按钮或位置(仅与事件有关的信息)之类的信息。