QT QSignalMapper

来源:互联网 发布:dsp快速傅里叶变换算法 编辑:程序博客网 时间:2024/05/17 02:20

信号对应槽

比如:鼠标点击按钮信号,对应自己定义的槽。如果想信号发送给槽的参数是某些有用的信息,比如:按钮的内容,怎么办呢?这个时候可以用

QSignalMapper
信号-----> QSignalMapper---------> 槽     (它在中间插了一杠子)
直接用qt帮助中的例子做说明:
a.h
#include <QWidget>#include <QSignalMapper>class ButtonWidget : public QWidget{    Q_OBJECTpublic:    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;}


注意:如果把上面的注释代码打开,点一次按钮就会相应两次槽,这点需要注意。。。。

原创粉丝点击