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

时间:2017-11-09 06:42:39

标签: c++ qt qlistview

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

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

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

然而,它似乎不起作用。即,QListView小部件中不显示任何数据。我已经调试了QMetaObject :: invokeMethod的返回值,并且它返回false,这表示没有方法称为" setModel"在QListView上。但是,当我安排通过用户界面线程调用回调时,即通过按钮on_clicked()事件并调用

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

这很有效,所以有一个" setModel" QListView上的方法..

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

你的,茫然和困惑.. 标记

1 个答案:

答案 0 :(得分:1)

方法QMetaObject::invokeMethod仅调用对象上的槽或信号。因此,setModel必须声明为slot。此外,Q_ARG()采用该类型的类型名称和const引用。