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

C++ QListView setModel问题通过QMetaObject::invoke调用,c++,qt,qlistview,C++,Qt,Qlistview,您好,我的用户界面上正确显示了QListView小部件 我正在注册一个完全独立的第三方库的回调。这个回调将在我的用户界面的一个完全独立的线程上调用。我需要这个回调来与QListView小部件交互并设置一个新的数据模型,所以我相信我必须使用 MyDataModel * model = new MyDataModel( ui->listViewWidget ); QMetaObject::invokeMethod( ui->listViewWidget, "setModel", Q_AR

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

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

MyDataModel * model = new MyDataModel( ui->listViewWidget );
QMetaObject::invokeMethod( ui->listViewWidget, "setModel", Q_ARG( MyDataModel *, model ) );
然而,它似乎不起作用。i、 e.QListView小部件中未显示任何数据。我已经调试了QMetaObject::invokeMethod的返回值,它返回false,这表明QListView上没有名为“setModel”的方法。但是,当我安排通过用户界面线程调用回调时,即通过_clicked()事件上的按钮并调用

MyDataModel * model = new MyDataModel( ui->listViewWidget );
ui->listViewWidget->setModel( model );
这非常有效,因此QListView上有一个“setModel”方法

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

你的,头晕目眩的。。
标记。

方法
QMetaObject::invokeMethod
仅调用对象上的插槽或信号。因此,您的
setModel
必须声明为
slot
。另外,
Q_ARG()。我担心从不同的线程设置模型是对的,还是这样做安全?或者,可能还有另一种方法可以获取在UI事件循环上调用的方法。如果调用的
QMetaObject::invodeMethod
的连接类型为
Qt::QueuedConnection
Qt::AutoConnection
,则可以安全地执行。好,既然您已经解释了setModel不是信号或插槽,那么我只需要找到合适的方法来设置模型。我确信我用了错误的方法来处理这个问题,否则就不会那么困难了。在另一个线程中更改
ListView
的模型并不是问题,只要您没有阻塞主线程。若将方法
setModel
添加到队列中,主线程将在不阻塞的情况下处理该方法。