Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从QWiget获取信号以更改get对象?_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何从QWiget获取信号以更改get对象?

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

您好,我有一个QWidget,如果我点击它,我想得到这个对象(我点击的QWidget元素),有没有这样做的方法

我已经找到了一些代码,但我只从


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如果您在实现我的解决方案时遇到问题,请编辑您的问题并提供答案,因此我将根据您的代码提供代码