QT——QSignalMapper

来源:互联网 发布:mac桌面文件突然消失 编辑:程序博客网 时间:2024/05/29 15:12

1、QSignalMapper类通过自定义信号发送者来捆绑信号。 


2、QSignalMapper 类收集一组无参信号,然后以 integer, string 或者 widget为参数重新发送信号,相当于经过QSignalMapper转发后,发送无参信号的类发送的有参的信号。

 

3、QSignalMapper 类通过setMapping(),支持从特定的字符串或者整数映射到指定的类(指QPushButton及其他)的功能。然后,这些指定的类将被连接到map()槽上,这个槽将发送 mapped() 后的和原始的发信号的类的关联的带有字符串或者整数的信号。映射的关系随后通过removeMappings()可以被移除。<简单说,就是所有指定的类,譬如按钮,都和QSignalMapper的map(),建立连接,然后由QSignalMapper类负责发送不同指定对象映射的不同的信号>


4、例如:假设我们想创建包含一按钮组(像调色板)的自定义widget。一种方法是关联每个按钮的clicked()操作到属于它自己的自定义槽;但是这个列子中,我们想关联所有的按钮到一个槽中,并且通过被点击的按钮来参数化槽。


5、下面就是一个简单的自定义有一个信号的widget,clicked(),通过被点击为text按钮来发射信号:

class ButtonWidget : public QWidget
{
    Q_OBJECT
public:
    ButtonWidget(QStringList texts, QWidget *parent = 0);
signals:
    void clicked(const QString &text);
private:
    QSignalMapper *signalMapper;
};

在构造函数中,我们唯一需要实现的函数:

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(QString)),
            this, SIGNAL(clicked(QString)));
    setLayout(gridLayout);
}

文本清单传递给构造函数列表。信号映射者 QSignalMapper 被构造,并且为列表中每一个text创建一个的按钮。我们关联每一个按钮的clicked()信号和信号映射者

QSignalMapper 
map()槽,并且为每个按钮和按钮的text建立一种映射关系。最后我们关联映射者的mapped()信号和自定义组件的clicked() 信号。当使用者点击按钮时,自定义组件将会发送一个带有按钮文本信息的参数的clicked信号。

==============================================================

总结:

1.所有信号都和 QSignalMapper 的 map()槽关联;

2.通过setMapping()建立,自定义对象和信号之间的关系(对应一个整数、字符串或者QWidget);

3.最后通过将 

QSignalMapper 
的 mapped(),和自定义的带参的函数相关联。

0 0
原创粉丝点击