0

在我的主窗口 ( 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也无济于事。

4

2 回答 2

1

根据文档 connectSlotsByName()仅支持签名,例如

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

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

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

于 2012-09-18T08:50:07.030 回答
0

我想这是

on_selectionModel_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
于 2012-09-17T20:18:43.860 回答