Qt:将已发送的发送器连接到接收器

时间:2013-08-22 14:13:41

标签: c++ qt signals-slots

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

  

itemChanged(QStandardItem *)

向我的SLOT发出信号。我做了

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

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

我做错了什么?

3 个答案:

答案 0 :(得分:0)

将模型设置为表格后进行连接可以完成工作。将模型设置为table后,它返回QStandardItemModel,因此无需强制转换。

答案 1 :(得分:0)

不要在dynamic_cast上使用QObject,使用qobject_cast作为等价物,它更安全(dynamic_cast对库共享的类有一些问题,所以这可能是你的问题,请参阅docs) 在连接中你无论如何都不需要这个演员(这只会在自动完成时有所帮助),静态演员也应该是Ok。

此外,当连接失败时,它会在日志中提示出现了什么问题,因此请查看日志。

答案 2 :(得分:0)

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

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

PS:如果您还没有model()作为指针成员,可能会更好,如果您还没有,而不是使用QStandardItemModel来检索它并且必须重复演员表每次需要访问model()类的特定功能时。
作为额外的好处,自动完成将起作用,因为QtCreator也会知道实际的对象类型。