Как определить, какой виджет испускает сигнал - PullRequest
2 голосов
/ 05 июня 2019

Я хочу сделать поля QlineEdit двойным щелчком, чтобы пользователь дважды щелкал по полю QlineEdit (например, 'qle01'), чтобы вызвать функцию. Функция должна иметь возможность идентифицировать по имени имя объекта QLineEdit, который отправил сигнал в функцию.

Я не знаю, является ли «имя» правильным словом для описания «qle01» и «qle02» в моем примере кода ниже. Возможно, лучшим термином будет «ручка».

В моем скрипте ниже, если дважды щелкнуть qle01, моя цель - напечатать строку 9 «Имя поля QLineEdit -« qle01 »». Буду признателен за помощь в выяснении того, как вывести строку 9 «Имя поля QLineEdit -« qle01 »."

Предоставление кредита, когда требуется кредит, за исключением моего псевдокода в строке 9, остальная часть приведенного ниже кода взята из примера № 1 в публикации StackOverflow по адресу mouseDoubleClickEvent с QLineEdit

import sys

from PyQt4 import QtGui

class LineEdit(QtGui.QLineEdit):
    def mouseDoubleClickEvent(self, event):
        print("pos: ", event.pos())
        # The next line is pseudo-code, because I don't know how to properly code it
        print("The QLineEdit field's name is '" + ['qle01' or 'qle02'] + "'") # i.e., depending on which of the 
                                                                       # QLineEdit fields was double-clicked  

class Widget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        qle01 = LineEdit()
        qle02 = LineEdit()
        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(qle01)
        lay.addWidget(qle02)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

У меня было несколько идей о том, как передать дескриптор или имя в слот / функцию, но я нигде не получил ничего полезного.

  1. Одна идея заключалась в том, чтобы сигнал поля QLineEdit отправлял в слот fuction слот QWidget.effectiveWinId (идентификатор системы окон) поля, но я не мог выяснить, как получить доступ к QWidget.effectiveWinId.

  2. Другая идея состояла в том, чтобы использовать функцию sender (), о которой я упоминал во многих публикациях и учебных пособиях (например, Как определить, кто излучал сигнал? ). Я попытался использовать функцию sender () следующим образом:

    class ObjectName(object):
    @QtCore.pyqtSlot()
    def __getattribute__(self, name):
        print "getting `{}`".format(str(name))
        print('str(self.sender()) = ' + str(self.sender()))      
    

Но последняя строка выдает этот вывод: str (self.sender ()) = Нет.

Я не могу найти ссылку на функцию sender () в Справочном руководстве PyQt4, расположенном по адресу https://www.riverbankcomputing.com/static/Docs/PyQt4/. Так что я не понимаю функцию sender () и, очевидно, не могу понять, как ее использовать.

Итак, нижняя строка, я был бы признателен за помощь в выяснении того, как заставить строку 9 печатать "Имя поля QLineEdit -" qle01 "."

1 Ответ

1 голос
/ 05 июня 2019

Имя переменной не идентифицирует объект, например, в следующем коде:

qle01 = LineEdit()
foo_name = qle01

Какое имя переменной, которая идентифицирует QLineEdit? Хорошо, qle01 и foo_name, так как оба являются псевдонимами в области памяти.

Что можно сделать, это идентифицировать объект, чтобы все переменные, которые указывают на один и тот же объект, имели одинаковый идентификатор.

С другой стороны, лучше реализовать сигнал для уведомления о двойном щелчке в QLineEdit, поскольку это позволит нам получить объект с помощью метода sender () объекта QObject.

import sys

from PyQt4 import QtCore, QtGui


class LineEdit(QtGui.QLineEdit):
    doubleClicked = QtCore.pyqtSignal()

    def mouseDoubleClickEvent(self, event):
        self.doubleClicked.emit()
        super(LineEdit, self).mouseDoubleClickEvent(event)


class Widget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        self.qle01 = LineEdit(doubleClicked=self.on_doubleClicked)
        self.qle02 = LineEdit(doubleClicked=self.on_doubleClicked)
        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(self.qle01)
        lay.addWidget(self.qle02)

    @QtCore.pyqtSlot()
    def on_doubleClicked(self):
        if self.sender() is self.qle01:
            print("The QLineEdit field's name is 'qle01'.")
        elif self.sender() is self.qle02:
            print("The QLineEdit field's name is 'qle02'.")


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
...