通过 QMetaObject::invoke 调用 QListView setModel 问题

QListView setModel problems calling via QMetaObject::invoke

您好,我的用户界面上正确显示了一个 QListView 小部件。

我正在注册一个完全独立的第 3 方库的回调。此回调将在我的用户界面的一个完全独立的线程上调用。我需要这个回调来与 QListView 小部件交互并设置新的数据模型,所以我相信我必须使用

MyDataModel * model = new MyDataModel( ui->listViewWidget );
QMetaObject::invokeMethod( ui->listViewWidget, "setModel", Q_ARG( MyDataModel *, model ) );

不过,好像不行。即 QListView 小部件中没有数据。我已经从 QMetaObject::invokeMethod 调试了 return 值,它是 returning false 这表明 QListView 上没有名为 "setModel" 的方法。但是,当我运行ge 通过用户界面线程调用回调时,即通过按钮 on_clicked() 事件并调用

MyDataModel * model = new MyDataModel( ui->listViewWidget );
ui->listViewWidget->setModel( model );

这非常有效,所以 QListView 上有一个 "setModel" 方法..

谁能帮我理解为什么 QMetaObject::invokeMethod 不起作用,也许可以弄清楚我是否需​​要以这种方式调用 invokeMethod。即我的线程假设是否正确,它需要在事件循环线程上 运行。

你的,茫然和困惑.. 马克.

方法QMetaObject::invokeMethod 仅调用对象上的插槽或信号。因此,您的 setModel 必须声明为 slotQ_ARG() 也接受类型名称和该类型的 const 引用。