Using QSignalMapper

From Qt Wiki
Jump to navigation Jump to search


Template:ArticleMetaData

Description[edit | edit source]

The QSignalMapper class is provided for situations where many signals are connected to the same slot and the slot needs to handle each signal differently. This class collects a set of parameterless signals, and re-emits them with integer, string or widget parameters corresponding to the object that sent the signal. In order to achieve this, QSignalMapper::setMapping() is used to map all the widget's signals to a single QSignalMapper object. Mappings can be removed later using QSignalMapper::removeMappings(). The widget's signals can then be connected to the QSignalMapper::map() slot. Finally, the QSignalMapper::mapped() signal is connected to any custom widget's signal/slot which can do the required processing.

Solution[edit | edit source]

SignalMapper.h

class SignalMapper : public QMainWindow
{
   Q_OBJECT
public:
   SignalMapper(QWidget *parent = 0);
   ~SignalMapper();
public slots:
   void digitClicked(int);
private:
   Ui::SignalMapperClass ui;
   // 3 Push buttons will provide 3 Signal's when clicked
   QPushButton *buttons[3];
   // Label is used to display from which Push Button Signal Came
   QLabel* mainlabel;
};


SignalMapper.cpp

SignalMapper::SignalMapper(QWidget *parent)
   : QMainWindow(parent)
{
  QWidget* mainwindow = new QWidget(this);
  QVBoxLayout* mainlayout =  new QVBoxLayout(mainwindow);
  //create the label & Signal Mapper
  mainlabel = new QLabel(mainwindow);
  QSignalMapper *signalMapper = new QSignalMapper(this);
  //connect the signal mapper's mapped signal to custom widgets slot
  connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(digitClicked(int)));
  
  for (int indx = 0; indx < 3; ++indx) 
  {
     QString text = QString::number(indx);
    
     //create the push buttons and enable the mapping
     buttons[indx] = new QPushButton(text, mainwindow);
     signalMapper->setMapping(buttons[indx], indx);
  
     //connect the push buttons signal to signal mappers slot
     connect(buttons[indx], SIGNAL(clicked()), signalMapper, SLOT(map()));
     mainlayout->addWidget(buttons[i]);
  }
  mainlayout->addWidget(mainlabel);
  mainwindow->setLayout(mainlayout);
  setCentralWidget(mainwindow);
}


zh-hans:使用 QSignalMapper