簡體   English   中英

如何從QWiget接收到更改獲取對象的信號?

[英]How do I get a signal from a QWiget to change get object?

您好,我有一個QWidget,如果單擊它,我想獲取該對象(單擊的QWidget元素)嗎?

我已經找到了一些代碼,但僅從獲得了MouseClickEvent

self.widget_34.mouseReleaseEvent = lambda事件:self.myfunction(event)

盡管@Cin提供的解決方案很有趣,但它存在一個嚴重的問題:它取消了小部件的mousePressEvent,因此小部件失去了當按下小部件時可能具有的行為,例如按鈕不再發出點擊信號,其他小部件也將有相同的問題。

較少干擾的解決方案是使用eventFilter:

import sys
import weakref
from PyQt5 import QtCore, QtWidgets


class ClickListener(QtCore.QObject):
    clicked = QtCore.pyqtSignal(QtWidgets.QWidget)

    def addWidget(self, widget, other_widget=None):
        if not hasattr(self, "_widgets"):
            self._widgets = {}
        widget.installEventFilter(self)
        self._widgets[widget] = widget if other_widget is None else other_widget
        weakref.ref(widget, self.removeWidget)

    def eventFilter(self, obj, event):
        if (
            obj in self._widgets
            and event.type() == QtCore.QEvent.MouseButtonPress
        ):
            self.clicked.emit(self._widgets[obj])
        return super(ClickListener, self).eventFilter(obj, event)

    def removeWidget(self, widget):
        if hasattr(self, "_widgets"):
            if widget in self._widgets:
                del self._widgets[widget]


class App(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        button = QtWidgets.QPushButton("Press Me")
        label = QtWidgets.QLabel("Stack Overflow")
        spinBox = QtWidgets.QSpinBox()
        te = QtWidgets.QTextEdit()

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(button)
        lay.addWidget(label)
        lay.addWidget(spinBox)
        lay.addWidget(te)

        listener = ClickListener(self)
        listener.clicked.connect(self.onClicked)
        listener.addWidget(button)
        listener.addWidget(label)
        listener.addWidget(spinBox.lineEdit(), spinBox)
        listener.addWidget(te.viewport(), te)

    def onClicked(self, obj):
        print("Clicked, from", obj)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())

我不確定這是否是正確的解決方案,但是我認為您可以使用functools模塊的部分方法。 就此模塊而言,可伸縮對象可被視為函數。 在這里,您可以看到我的示例,

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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM