• 9508阅读
  • 6回复

[提问][SOLVED]如何得知哪个push button发起click signal? [复制链接]

上一主题 下一主题
离线rr_tw
 
只看楼主 倒序阅读 楼主  发表于: 2010-10-27
— 本帖被 XChinux 从 Qt Installation and Deployment 移动到本区(2011-01-07) —
同胞们好

想问下,假设我的UI有些许push button,都把clicked() signal连接到同一个slot,如下
  1. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  2. {
  3.   connect(this->ui->pushButton_11, SIGNAL(clicked()), this, SLOT(slotPlay()));
  4.   connect(this->ui->pushButton_12, SIGNAL(clicked()), this, SLOT(slotPlay()));
  5.   connect(this->ui->pushButton_13, SIGNAL(clicked()), this, SLOT(slotPlay()));
  6.   connect(this->ui->pushButton_14, SIGNAL(clicked()), this, SLOT(slotPlay()));
  7.   connect(this->ui->pushButton_15, SIGNAL(clicked()), this, SLOT(slotPlay()));
  8. }
  9. void MainWindow::slotPlay()
  10. {
  11.   ...
  12.   ...
  13. }


我是否有办法在slotPlay()内得知是哪个push button发起clicked() signal?
或是,大家可推荐些key word我可以找到相关的讯息...

谢谢大家~
[ 此帖被rr_tw在2010-10-29 17:01重新编辑 ]
中華民族,中華聯邦,這主意如何?
离线gualichao
只看该作者 1楼 发表于: 2010-10-27
你好,这个问题在QT认证考试中也出现过,
问题不难。
有两种方法可以解决
1,QObject::sender()
2,QSignalMapper

请自行查看帮助文档, 推荐使用QSignalMapper, sender 原则上违背了C++ 的一些特性
离线lvyinghe
只看该作者 2楼 发表于: 2010-10-27
回 楼主(rr_tw) 的帖子
偶菜鸟,但是从<精通QT4编程>一书中有个小例子,跟楼主的要求一样。
代码如下:
SLOT中有代码
QPushButton* btn=qobject_cast<QPushButton* >(sender());
if(btn==btn1) {  ....  }
其中btn1是已经定义的(Private or Public)。
离线foxyz

只看该作者 3楼 发表于: 2010-10-28
QObject::sender()
这个最简单。好用
离线icing
只看该作者 4楼 发表于: 2010-10-28
菜鸟学习,飘过。。。。。。。。。
离线rr_tw
只看该作者 5楼 发表于: 2010-10-29
Re:如何得知哪個push button發起click signal?
謝謝各位,最後我並未使用sender(),而採用QSignalMapper...
節錄程式碼如下
.h file
  1. public slots:
  2.   void slotDirectPlay(QString str);
  3. protected:
  4.   void changeEvent(QEvent *e);
  5.   QSignalMapper *signalMapper;


.cpp file
  1. this->signalMapper=new QSignalMapper(this);
  2.   connect(this->ui->pushButton_6, SIGNAL(clicked()), signalMapper, SLOT(map()));
  3.   signalMapper->setMapping(this->ui->pushButton_6, this->ui->pushButton_6->toolTip());
  4.   connect(this->ui->pushButton_7, SIGNAL(clicked()), signalMapper, SLOT(map()));
  5.   signalMapper->setMapping(this->ui->pushButton_7, this->ui->pushButton_7->toolTip());
  6.   connect(this->ui->pushButton_8, SIGNAL(clicked()), signalMapper, SLOT(map()));
  7.   signalMapper->setMapping(this->ui->pushButton_8, this->ui->pushButton_8->toolTip());
  8.   connect(this->ui->pushButton_9, SIGNAL(clicked()), signalMapper, SLOT(map()));
  9.   signalMapper->setMapping(this->ui->pushButton_9, this->ui->pushButton_9->toolTip());
  10.   connect(this->ui->pushButton_10, SIGNAL(clicked()), signalMapper, SLOT(map()));
  11.   signalMapper->setMapping(this->ui->pushButton_10, this->ui->pushButton_10->toolTip());
  12.   connect(this->signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(slotDirectPlay(QString)));  // 剛漏掉這行,我跌股了 ..@@"
  13. ...
  14. ...
  15. void MainWindow::slotDirectPlay(QString str)
  16. {
  17.   // I can get button's tool tip text here, finally :)
  18. }
[ 此帖被rr_tw在2010-10-29 17:00重新编辑 ]
中華民族,中華聯邦,這主意如何?
离线iiiii
只看该作者 6楼 发表于: 2011-01-03
学习,飘过。。。。
快速回复
限100 字节
 
上一个 下一个