2011-01-10 11 views
5

Desarrollo una aplicación en PyQt, me gusta el modelo de ranura de señal, pero ¿hay alguna forma de determinar el emisor de señal ? Espero que haya una manera, porque permitirá escribir un código más genérico sin definir muchas ranuras para cada señal similar.¿Cómo se determina quién emitió la señal?

+2

Estoy realmente sorprendido de que alguien diga que requerir información sobre un remitente en la ranura hace que el código sea * más * genérico. En general, los espacios se escriben de modo que no requieren ningún conocimiento de cómo se activaron (es decir, también podrían llamarse como métodos directamente). –

Respuesta

16

Creo que abrí una pregunta demasiado pronto, porque encontré una respuesta en google solo. Cuando ranura se activa por el emisor, el puntero de emisor almacenados, y pueden ser recuperados por

QObject::sender() 

y como resultado se puede acceder en PyQt por:

@QtCore.pyqtSlot() 
def someSlot(self): 
    self.sender() 
+2

Debe tener en cuenta el waring en la documentación antes de usar esta función: http://doc.qt.nokia.com/4.7/qobject.html#sender –

+0

Patrice aquí está el enlace actualizado: https: // qt-project .org/doc/qt-4.7/qobject.html # remitente – neuronet

-3

cuenta que esto no hace decirte, por ejemplo. qué celda se controló en la cuadrícula, solo el control de la cuadrícula en sí.

Hay un nuevo libro de avanzada Qt fuera que entra en muchos detalles acerca avanzado de señal/ranura de enrutamiento

1

Es posible que desee ver en la clase QSignalMapper, ya que proporciona un medio para asociar ya sea un entero, cadena, o parámetros del widget a un objeto que envía una señal dada. La principal limitación es que la señal/ranura que se mapea debe ser sin parámetros.

C++ ejemplo de la QT4.7 documentation:

ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent) 
    : QWidget(parent) 
{ 
    signalMapper = new QSignalMapper(this); 

    QGridLayout *gridLayout = new QGridLayout; 
    for (int i = 0; i < texts.size(); ++i) { 
     QPushButton *button = new QPushButton(texts[i]); 
     connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
     signalMapper->setMapping(button, texts[i]); 
     gridLayout->addWidget(button, i/3, i % 3); 
    } 

    connect(signalMapper, SIGNAL(mapped(const QString &)), 
      this, SIGNAL(clicked(const QString &))); 

    setLayout(gridLayout); 
} 

Usted puede encontrar un ejemplo PyQt4 here, sin embargo, cuando tengo la oportunidad voy a tratar de añadir un ejemplo sencillo PyQt4.

Cuestiones relacionadas