gpt4 book ai didi

c++ - QSignalMapper 和原始 Sender()

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:01 25 4
gpt4 key购买 nike

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

(为什么 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 !!
}

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

最佳答案

为什么不将 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
}
}

关于c++ - QSignalMapper 和原始 Sender(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com