嗨,我在我的用户界面上正确显示了QListView小部件。
我正在注册一个完全独立的第三方库的回调。此回调将在与我的用户界面完全不同的线程上调用。我需要此回调与QListView小部件进行交互并设置新的数据模型,因此我相信我必须使用
MyDataModel * model = new MyDataModel( ui->listViewWidget );
QMetaObject::invokeMethod( ui->listViewWidget, "setModel", Q_ARG( MyDataModel *, model ) );
但是,它似乎不起作用。即QListView小部件中没有数据。我已经调试了QMetaObject :: invokeMethod的返回值,并且返回的是false,这表明QListView上没有所谓的“ setModel”方法。但是,当我安排通过用户界面线程调用回调时,即通过按钮on_clicked()事件进行调用
MyDataModel * model = new MyDataModel( ui->listViewWidget );
ui->listViewWidget->setModel( model );
这可以完美地工作,因此QListView上有一个“ setModel”方法。
有人可以帮我理解为什么QMetaObject :: invokeMethod不起作用的原因,并且可能需要我以这种方式调用invokeMethod才能解决。即我的线程假设是否正确,需要在事件循环线程上运行它。
你的,茫然而困惑。
标记。
最佳答案
方法QMetaObject::invokeMethod
仅调用对象上的插槽或信号。因此,您的setModel
必须声明为slot
。同样,Q_ARG()
带有类型名称和该类型的const引用。
关于c++ - 通过QMetaObject::invoke调用QListView setModel问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47195487/