2011-01-10 8 views
5

私はPyQtのアプリケーションを開発しました。私は信号スロットモデルが好きですが、信号のエミッタを決定する方法はありますか? 私はそこに方法があることを願っています。なぜなら、それぞれの類似した信号のスロットをたくさん定義することなく、より一般的なコードを書くことができるからです。誰が信号を発信したのかを決定する方法は?

+2

私は、誰かがスロット内の送信者に関する情報を要求するとコードがより*一般的になると言うのを聞いて本当に驚いています。一般に、スロットは、どのように起動されたかについての知識を必要としないように書かれている(すなわち、直接的にも方法として呼び出すことができる)。 –

答えて

16

私は自分でGoogleで答えを見つけたので、私は早すぎる質問を開いたと思います。スロットは、エミッタによって活性化されると は、エミッタのポインタが格納され、及び

QObject::sender() 

によって取得することができ、その結果によってPyQtはでアクセスすることができる:これはないこと

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

この機能を使用する前に、ドキュメントに記載されていることに注意する必要があります。http://doc.qt.nokia.com/4.7/qobject.html#sender –

+0

ここでは、更新されたリンクです:https:// qt-project .org/doc/qt-4.7/qobject.html#sender – neuronet

-3

注たとえばあなたに教えてください。グリッドコントロールのどのセルが編集されましたか?グリッドコントロールだけが処理します。

それはint型のいずれかを関連付けるための手段を提供してあなたは、QSignalMapperクラスに見たいと思うかもしれません

1

をルーティングする高度な信号/スロットに関する詳細の多くに入る新しい高度なQtのブックアウトがあり、文字列、またはウィジェットのパラメタを、指定されたシグナルを送信するオブジェクトに送信します。主な制限は、マッピングされる信号/スロットがパラメータなしである必要があることです。 QT4.7 documentationから

C++の例:私は、私は簡単なPyQT4例を追加しようとするでしょう機会を持っている場合

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

ただし、PyQT4例hereを見つけることができます。

関連する問題