QSignalMapper和原始发件人()

时间:2009-12-10 18:49:51

标签: c++ qt qt4

我在表格中有一堆QComboBox个es。所以我知道触发了哪一个我重新映射信号以编码表格单元位置(如Selecting QComboBox in QTableWidget中所述)

(为什么Qt不会先发送单元激活信号,因此您可以使用与我不知道的任何其他单元格编辑相同的当前行/列机制。)

但这会删除原始发件人窗口小部件的所有知识。在广告位中调用QComboBox* combo = (QComboBox* )sender()失败,大概是因为sender()现在是QSignalMapper

我可以使用编码的行/列来查找表小部件中的QComboBox,但这似乎是错误的。有没有更正确的方法呢?

e.g:

// in table creator
_signalMapper = new QSignalMapper(this);

 // for each cell
    QComboBox* combo = new QComboBox();
    connect(combo, SIGNAL(currentIndexChanged(int)), _signalMapper, SLOT(map()));
    _signalMapper->setMapping(combo, row);

   // and finally       
   connect(_signalMapper, SIGNAL(mapped(int)),this, SLOT(changedType(int)));

 // slot
 void myDlg::changedType(int row)
 {      
        QComboBox* combo = (QComboBox* )sender(); // this doesn't work !!
 }

编辑:为将来的搜索添加:Mark Summerfield有一本新书“高级Qt编程”,解释了如何做这类事情。

2 个答案:

答案 0 :(得分:8)

为什么不直接将QComboBox的信号连接到您的插槽?

QComboBox *combo = ...
connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(changedType(int)));

然后在您的插槽中,您可以使用sender()方法来检索已更改的QComboBox。

void myDlg::changedType(int row)
{
    QComboBox *combo = qobject_cast<QComboBox *> sender();

    if(combo != 0){
        // rest of code
    }
}

或者,要使用QSignalMapper方法,您只需更改插槽即可使用您设置的映射:

void myDlg::changedType(int row)
{
    QComboBox *combo = qobject_cast<QComboBox *>(_signalMapper->mapping(row));

    if(combo != 0){
        // rest of code
    }
}        

答案 1 :(得分:0)

我不知道确切的答案,但也许您应该使用:QComboBox * combo = qobject_cast(sender())而不是QComboBox * combo =(QComboBox *)sender()。像这样:


 QObject* obj = sender();
 QComboBox* combo = qobject_cast<QComboBox*>(obj);
 if(combo)
 {
  doSomethingWithCombo(combo);
 }
 else
 {
  // obj is not QComboBox instance
 }

但也许QSignalMapper真的可以替代自己而不是真正的发送者...