zoukankan      html  css  js  c++  java
  • Qt QSignalMapper(信号映射器)

      QT中通过信号/槽机制,将信号与槽函数关联。有时候希望获得信号发送者信息,QT提供了QObject::sender()函数来返回发送该信号的对象的指针。但是如果有多个信号关联到了同一个槽上,而在该槽中需要对每一个信号进行不同的处理,使用上面的方法就很麻烦了。对于这种情况,便可以使用QSignalMapper类。QSignalMapper可以叫做信号映射器,可以实现对多个相同部件的相同信号进行映射,为其添加字符串或者数值参数,然后再发射出去。

    示例如下:

    mainwidget.h

     1 #ifndef MAINWIDGET_H
     2 #define MAINWIDGET_H
     3 #include <QWidget>
     4 #include <QSignalMapper>
     5 class MainWidget : public QWidget
     6 {
     7    Q_OBJECT 
     8 //槽函数
     9 private slots: 
    10     //处理最终信号的槽
    11     void doClicked(const QString & btnname);
    12 private:
    13    QSignalMapper *signalMapper;
    14 public:
    15    MainWidget(QWidget *parent = 0);
    16 };
    17 #endif // MAINWIDGET_H 

    mainwidget.cpp

     1 #include <QGridLayout>
     2 #include <QPushButton>
     3 #include <QMessageBox>
     4 #include "mainwidget.h"
     5 void MainWidget::doClicked(const QString &btnname)
     6 {
     7    //显示被按下的btn名称。 
     8    QMessageBox::information(this, "Clicked", btnname + " is clicked!");
     9 }
    10 MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
    11 {
    12    //10个button 
    13    QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10"; 
    14    QStringList texts = buttontext.split(","); 
    15    signalMapper = new QSignalMapper(this); 
    16    QGridLayout *gridLayout = new QGridLayout; 
    17    for (int i = 0; i < texts.size(); ++i) 
    18    {
    19       QPushButton *button = new QPushButton(texts[i], this); 
    20       button->setObjectName(texts[i]); 
    21       //原始信号传递给signalmapper 
    22       connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
    23       signalMapper->setMapping(button, texts[i]); 
    24       //设置signalmapper的转发规则, 转发为参数为QString类型的信号, 并把texts[i]的内容作为实参传递。 
    25       gridLayout->addWidget(button, i / 3, i % 3); 
    26    }
    27    //将转发的信号连接到最终的槽函数
    28    connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(doClicked(const QString &))); 
    29    setLayout(gridLayout);
    30 }

    main.cpp

    1 #include "mainwidget.h"
    2 #include <QApplication>
    3 int main(int argc, char *argv[])
    4 { 
    5    QApplication a(argc, argv); 
    6    MainWidget w;
    7    w.show(); 
    8    return a.exec();
    9 }
  • 相关阅读:
    如何面试前端工程师!
    CSS实现背景透明,文字不透明(各浏览器兼容)
    IE6中伪类:hover的使用及BUG
    jQuery UIdraggable参数学习
    PHP与正则表达式 2 :一些修饰符与preg_match_all
    通过apktool获取apk package name(包名)以及activity name
    jquery.ui.draggable中文文档
    无法加载php_curl.dll解决办法
    ubuntu命令查询版本和内核版本
    linux zip, unzip命令详解[ubuntu]
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14636916.html
Copyright © 2011-2022 走看看