我QComboBox在桌子上有一堆es.因此我知道触发了哪一个我重新映射信号以编码表格单元位置(如在QTableWidget中选择QComboBox中所述)
(为什么Qt不只是首先发送单元激活信号,因此您可以使用与我不知道的任何其他单元格编辑相同的当前行/列机制.)
但这会删除原始发件人窗口小部件的所有知识.QComboBox* combo = (QComboBox* )sender()在插槽中调用失败,大概是因为sender()现在是QSignalMapper.
我可以使用编码的行/列来查找QComboBox表小部件,但这似乎是错误的.有更正确的方法吗?
例如:
// 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 !!
}
Run Code Online (Sandbox Code Playgroud)
编辑:为将来的搜索添加:Mark Summerfield 有一本新书" 高级Qt编程 ",解释了如何做这种事情.
为什么不直接将QComboBox的信号连接到您的插槽?
QComboBox *combo = ...
connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(changedType(int)));
Run Code Online (Sandbox Code Playgroud)
然后在您的插槽中,您可以使用sender()方法来检索已更改的QComboBox.
void myDlg::changedType(int row)
{
QComboBox *combo = qobject_cast<QComboBox *> sender();
if(combo != 0){
// rest of code
}
}
Run Code Online (Sandbox Code Playgroud)
或者,要使用QSignalMapper方法,您只需更改插槽即可使用您设置的映射:
void myDlg::changedType(int row)
{
QComboBox *combo = qobject_cast<QComboBox *>(_signalMapper->mapping(row));
if(combo != 0){
// rest of code
}
}
Run Code Online (Sandbox Code Playgroud)