一个小demo,点击不同的按钮,输入框会显示不同按钮上的文字。
关键代码:
1 //定义一个网格布局 2 QGridLayout *pLayout = new QGridLayout(); 3 //窗口设置布局 4 this->centralWidget()->setLayout(pLayout); 5 6 QString str="button1,button2,button3,button4,button5,button6"; 7 //按逗号拆分 8 QStringList StrList =str.split(","); 9 //定义一个信号映射对象 10 QSignalMapper *pmap = new QSignalMapper(this); 11 12 for(int i=0;i<StrList.length();i++) 13 { 14 QPushButton *pBtn = new QPushButton(this); 15 pBtn->setText(StrList.at(i)); 16 //当按下按钮后signalmapper先接受信号,暂时不处理 17 connect(pBtn,SIGNAL(clicked()),pmap,SLOT(map())); 18 //在处理之前,把按钮和字符串组成映射关系,给按钮关联一个字符串 19 pmap->setMapping(pBtn,pBtn->text()); 20 //把按钮放到布局中第i行第0列 21 pLayout->addWidget(pBtn,i,0); 22 23 } 24 QLineEdit *pEdit=new QLineEdit(this); 25 //上面关联的是QString类型,signalmapper就会发送参数是QString的信号。根据这个信号 26 //就能判断是哪个按钮 27 connect(pmap,SIGNAL(mapped(QString)),pEdit,SLOT(setText(QString))); 28 29 pLayout->addWidget(pEdit,0,1);
在第27行也可以自定义槽函数,在.h文件中先声明参数为QString槽函数(Qt4),在cpp文件中实现槽函数,根据发送过来的QString进一步做出判断,如果是button1执行什么样的操作,如果是button2又执行什么样的操作。
1 connect(pmap,SIGNAL(mapped),this,SLOT(myslot(QString))); 2 3 void mysignalmapper::myslot(QString text) 4 { 5 if(text=="button1") 6 { 7 //.... 8 } 9 else if(text == "button2") 10 { 11 //... 12 } 13 ... 14 }