QSignalMapper类使用

来源:互联网 发布:英雄无敌2 for mac 编辑:程序博客网 时间:2024/06/05 15:08

QSignalMapper类使用

如果我们想要将一组按钮的信号(比如说 clicked() 信号)与一个相同的槽函数相关联,可以有两种方法。
1.我们可以使用 connect 函数将每一个按钮的 clicked() 信号与这个槽函数关联。很明显,这样子很烦,不够聪明。
2.或者使用 QSignalMapper 类,如下所示:
buttonwidget.h 如下:

#ifndef BUTTONWIDGET_H#define BUTTONWIDGET_H#include <QWidget>#include <QSignalMapper>class ButtonWidget : public QWidget{    Q_OBJECTpublic:    explicit ButtonWidget(const QStringList &texts, QWidget *parent = 0);signals:public slots:    void clicked(const QString &text);private:    QSignalMapper *signalMapper;};#endif // BUTTONWIDGET_H

buttonwidget.cpp 如下:

#include "buttonwidget.h"#include <QGridLayout>#include <QPushButton>#include <QDebug>ButtonWidget::ButtonWidget(const 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/5, i%5);    }    connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(clicked(QString)));    setLayout(gridLayout);    for(int i=0; i<texts.size(); ++i)    {        qDebug() << signalMapper->mapping(texts.at(i));    }}void ButtonWidget::clicked(const QString &text){    qDebug() << text;}
0 0
原创粉丝点击