2011-01-10 17 views
5

PyQt üzerinde bir uygulama geliştiriyorum, sinyal yuvası modelini beğendim, fakat sinyal yayıcıyı belirlemenin herhangi bir yolu var mı? Umarım bir yol vardır, çünkü her benzer sinyal için çok fazla slot tanımlamaksızın daha genel kod yazabilir.Sinyalin kim tarafından verildiği nasıl belirlenir?

+2

Birisi, yuvadaki bir gönderici hakkında bilgi gerektiren kodun * daha * jenerik olduğunu söylemesini duyduğuma gerçekten şaşırdım. Genel olarak, yuvalar nasıl yazıldığına dair herhangi bir bilgi gerektirmeyecek şekilde yazılır (yani doğrudan doğruya yöntemler olarak da adlandırılabilir). –

cevap

16

Sanırım çok erken bir soru açtım, çünkü google'a kendimden bir cevap buldum. yuvası yayıcı tarafından aktive edildiğinde , damlatıcının işaretçi saklanır ve

QObject::sender() 

tarafından alınabilir ve bunun sonucu olarak tarafından PyQt'de erişilebilir: bu değildir bu

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

Bu işlevi kullanmadan önce belgelerindeki uyarıdan haberdar olmalısınız: http://doc.qt.nokia.com/4.7/qobject.html#sender –

+0

Patrice işte buradaki link: https: // qt-project .org/doc/qt-4.7/qobject.html # gönderici – neuronet

-3

Not örneğin söyle. Bir ızgara kontrolünde hangi hücreye rastlandı - sadece ızgara kontrolü kendini idare eder.

, ya bir int ilişkilendirmek için bir araç sağlar gibi, QSignalMapper sınıfa bakmak isteyebilirsiniz

1

yönlendirme gelişmiş sinyal/yuvası hakkında ayrıntılı bir sürü gider hangi yeni Gelişmiş Qt kitap var dışarı string veya widget, belirli bir sinyali gönderen bir nesneye dönüşür. Ana sınırlama, eşleştirilen sinyal/yuvanın parametre-az olması gerektiğidir. QT4.7 documentation den

C++ örnek: Ben basit bir PyQt4 örnek eklemeye çalışacağım bir şans varken

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); 
} 

Bununla birlikte, bir PyQt4 örnek here bulabilirsiniz.