我有一个应用程序,其中包含一个QTreeView其底层模型,比如MyModel从QStandardItemModel. 为了从view中过滤掉一些items MyModel,我把它插进aQSortFilterProxyModel里面,然后又插进了QTreeView。当我需要从我的代理模型的给定索引中获取源模型的一项时,我总是必须这样编码:
auto my_model = dynamic_cast<MyModel*>(proxy_model->sourceModel());
auto source_index = proxy_model->mapToSource(proxy_index);
auto item = my_model->itemFromIndex(source_index);
Run Code Online (Sandbox Code Playgroud)
我没有找到任何直接的方法来做到这一点。您是否知道更直接的方法来做到这一点,或者是我在使用 Qt 代理模型概念的方式中理解某些东西的迹象?
您正在正确使用它 - 您正在执行的步骤没有内置的快捷方式。
qobject_cast如果MyModel有Q_OBJECT宏,你可以用来加快速度,否则这就是如何使用模型。
对于这样的情况,我通常会在使用模型的类上创建一个包装方法,或者扩展QSortFilterProxyModel具有这样一个方法的类。例如,您可以创建一个StandardSortFilterProxyModel扩展前者并且只接受QStandardItemModel基于类的类,并提供一堆方法来以您需要的方式访问项目。
请注意,如果您只想从模型中获取特定数据而不是项目本身(如所选列的文本),您始终可以proxy_model->data(proxy_index)直接使用并从 QVariant 中获取您的值。