connectSlotsByName可以连接到选择模型的变化吗?

时间:2012-09-17 08:39:04

标签: qt signals-slots

在我的主窗口(QMainWindow)中,我有QTableView(名为commandsTableView)。现在我想对其选择变化做出反应。

我制作了一个插槽并手动将其连接到ui.commandsTableView->selectionModel()。一切正常。

但后来我想:为什么不使用自动连接(特别是会有更多的连接要做)?至少它会为一致的命名规则增加更多的力量。

然而,我无法找到正确的名称语法。我试过了:

  • on_commandsTableView_selectionModel_selectionChanged
  • on_commandsTableViewSelectionModel_selectionChanged
  • on_commandsTableView_selectionChanged
  • on_commandsTableView___selectionChanged

但都没有奏效。在所有情况下,运行应用程序时都会在输出上显示一条消息(带有相应的插槽名称,此处仅作为示例首先提供):

QMetaObject::connectSlotsByName: No matching signal for on_commandsTableView_selectionModel_selectionChanged(QItemSelection,QItemSelection)

(为什么在连接错误的响应中没有断言 - 我无法理解。在输出输出信息之前,我很遗憾地想知道出了什么问题。)

ui.commandsTableView->selectionModel()返回的对象名称为空。但是,在拨打selectionModel之前将其设置为connectSlotsByName也无济于事。

2 个答案:

答案 0 :(得分:1)

根据 the documentation connectSlotsByName()仅支持

等签名

void on_<object name>_<signal name>(<signal parameters>);

根据 the sources ,它是唯一检查的形式(观察它如何收集子项列表,然后将父项的方法名称与子项名称进行匹配)。

因此,为了能够使用自动连接,您需要一个命名选择模型,该模型将从调用connectSlotsByName()开始继续存在。每次更改选择模型(不太可能)或模型(可能)时,您必须为选择模型命名并再次自动连接。但是唉connectSlotsByName()将复制所有其他连接,因为它似乎没有检查连接是否是唯一的,所以我们必须手动将信号连接到动态子模型,场景。 / p>

答案 1 :(得分:0)

我认为是

on_selectionModel_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected)