Python 如何从QWiget获取信号以更改get对象?
您好,我有一个QWidget,如果我点击它,我想得到这个对象(我点击的QWidget元素),有没有这样做的方法 我已经找到了一些代码,但我只从Python 如何从QWiget获取信号以更改get对象?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,您好,我有一个QWidget,如果我点击它,我想得到这个对象(我点击的QWidget元素),有没有这样做的方法 我已经找到了一些代码,但我只从 self.widget_34.mouseReleaseEvent=lambda event:self.myfunction(event)我不确定这是否是一个合适的解决方案,但我认为,您可以使用functtools模块的分部方法。在本模块中,可协作对象可以视为函数。在这里你可以看到我的例子 import sys from PyQt5.QtCore impo
self.widget_34.mouseReleaseEvent=lambda event:self.myfunction(event)我不确定这是否是一个合适的解决方案,但我认为,您可以使用functtools模块的分部方法。在本模块中,可协作对象可以视为函数。在这里你可以看到我的例子
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
import functools
class App(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(200,200,200,200)
self.button = QPushButton('Button', self)
self.button.move(50,50)
self.label = QLabel(self)
self.label.setText("Label")
self.label.move(100,100)
self.items = [self.button, self.label]
for i in self.items:
i.mousePressEvent = functools.partial(self.getClickedItem, source_object=i)
self.show()
def getClickedItem(self, event, source_object=None):
print("Clicked, from", source_object)
#item text
#print(source_object.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
虽然提供的解决方案很有趣,但它有一个严重的问题:它取消了小部件的mousePressEvent,因此小部件在按下小部件时可能会失去行为,例如按钮不再发出单击的信号,其他小部件也会有同样的问题 一种侵入性较小的解决方案是使用eventFilter: 导入系统 进口武器 从PyQt5导入QtCore、QtWidgets 类ClickListener(QtCore.QObject): clicked=QtCore.pyqtSignal(qtwidts.QWidget) def addWidget(self、widget、other_widget=None): 如果不是hasattr(self,“\u小部件”): self.\u widgets={} widget.installEventFilter(自身) self._widgets[widget]=如果其他_widget不是其他_widget,则为widget weakref.ref(小部件,self.removeWidget) def事件过滤器(自身、obj、事件): 如果( 在self.\u小部件中的obj 和event.type()==QtCore.QEvent.MouseButtonPress ): self.clicked.emit(self.\u小部件[obj]) 返回超级(ClickListener,self).eventFilter(obj,事件) def removeWidget(自我,小部件): 如果hasattr(self,“\u小部件”): 如果小部件在self.\u小部件中: del self.\u小部件[小部件] 类应用程序(qtwidts.QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() button=QtWidgets.QPushButton(“按我”) label=qtwidts.QLabel(“堆栈溢出”) spinBox=qtwidts.QSpinBox() te=QtWidgets.QTextEdit() lay=qtwidts.QVBoxLayout(self) lay.addWidget(按钮) lay.addWidget(标签) lay.addWidget(spinBox) lay.addWidget(te) 侦听器=单击侦听器(自身) listener.clicked.connect(self.onClicked) addWidget(按钮) addWidget(标签) listener.addWidget(spinBox.lineEdit(),spinBox) listener.addWidget(te.viewport(),te) def onClicked(自身、obj): 打印(“单击,从”,obj) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) ex=App() 例如:show() sys.exit(app.exec_())
但在本例中,我只能单击标签、按钮等,然后到达目标位置。但是我想点击一个特定的小部件来获取这个小部件,这样我就可以对它进行染色了。如以下示例:@D.Raphael如果您在实现我的解决方案时遇到问题,请编辑您的问题并提供答案,因此我将根据您的代码提供代码