Qt:将广播的发送器连接到接收器

Qt: Connect casted sender to a receiver

本文关键字:连接 接收器 广播 Qt      更新时间:2023-10-16

在我的程序中,我有一个QTableView,它被设置为显示QStandardItemModel。我想连接Model的

itemChanged(QStandardItem*)

给我的SLOT发信号。我做了

connect(dynamic_cast<QStandardItemModel*>(ui->tableView->model()), SIGNAL(itemChanged(QStandardItem*)), this, SLOT(saveItem(QStandardItem*)));

但这总是无法连接(返回false)。我猜是因为dynamic_cast,但我不确定。

我做错了什么??

即使QTableView::model()返回QAbstractItemModel*,如果在建立连接之前将模型设置为QStandardItemModel*,实际对象仍然是QStandardItemModel,因此连接应该可以工作,而无需将指针强制转换为该类型。

可能的连接错误包括:空指针(在调用model()之前未设置模型)、插槽/信号名称拼写错误、未将函数声明为插槽/信号。

PS:如果您的类中还没有QStandardItemModel,那么最好将其作为指针成员,而不是使用model()来检索它,并且每次需要访问QStandardItemModel类的特定函数时都必须重复强制转换。
另外一个好处是,自动完成可以工作,因为QtCreator也知道实际的对象类型。

将模型设置为表后进行连接即可完成此任务。将模型设置为表后,它将返回QStandardItemModel,因此不需要强制转换。

不要在QObjects上使用dynamic_cast,使用等效的qobject_cast,这样更安全(dynamic_cast在库共享类方面存在一些问题,因此这可能是您的问题,请参阅文档)
在connect中,您无论如何都不需要此强制转换(这只会在自动完成时有所帮助),静态强制转换也应该可以。

此外,当连接失败时,它会在日志中提示到底出了什么问题,所以请检查日志。