信号对应槽
比如:鼠标点击按钮信号,对应自己定义的槽。如果想信号发送给槽的参数是某些有用的信息,比如:按钮的内容,怎么办呢?这个时候可以用
QSignalMapper
信号-----> QSignalMapper---------> 槽 (它在中间插了一杠子)
直接用qt帮助中的例子做说明:
a.h
#include <QWidget> #include <QSignalMapper> class ButtonWidget : public QWidget { Q_OBJECT public: ButtonWidget(const QStringList &texts, QWidget *parent = 0); signals: void clicked(const QString &text); private: void onCliecked(const QString &text); QSignalMapper *signalMapper; };
a.cpp
#include <QGridLayout> #include <QPushButton> #include <QMessageBox> #include "a.h" ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent) : signalMapper(NULL) { signalMapper = new QSignalMapper(this); QGridLayout *gridLayout = new QGridLayout; for (int i = 0; i < texts.size(); ++i) { QPushButton *button = new QPushButton(texts[i]); // 本来应该连接自定义槽,这里却连接的是signalMapper connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); // 发送的东西放到映射中(按钮和其内容对应) signalMapper->setMapping(button, texts[i]); gridLayout->addWidget(button, i / 3, i % 3); } // 这里通过signalMapper连接自定义槽 connect(signalMapper, static_cast<void (QSignalMapper::*)(const QString&)>(&QSignalMapper::mapped), this, &ButtonWidget::onCliecked); // connect(signalMapper, static_cast<void (QSignalMapper::*)(const QString&)>(&QSignalMapper::mapped), // this, &ButtonWidget::onCliecked); setLayout(gridLayout); } void ButtonWidget::onCliecked(const QString &text) { QMessageBox::information(this, "title", text); }
main.cpp
#include <QApplication> #include "a.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); ButtonWidget bw(QStringList() << "a" << "b" << "c" << "d" << "e" << "f", NULL); bw.show(); app.exec(); return 0; }
注意:如果把上面的注释代码打开,点一次按钮就会相应两次槽,这点需要注意。。。。