我在表格中有一堆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编程”,解释了如何做这类事情。
答案 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真的可以替代自己而不是真正的发送者...