• qt-mvvm代码分析


    qt-mvvm是GitHub上一套基于Qt的MVVM框架。本文旨在通过深入分析qt-mvvm的实现过程,来研究MVVM的实现要点。

    一、概念、原理

    Ref. from Martin Fowler's GUI Architecture

    The controls display data - in this case about the reading. This data will pretty much always come from somewhere else, in this case let's assume a SQL database as that's the environment that most of these client-server tools assume. In most situations there are three copies of the data involved:

    • One copy of data lies in the database itself. This copy is the lasting record of the data, so I call it the record state. The record state is usually shared and visible to multiple people via various mechanisms.
    • A further copy lies inside in-memory Record Sets within the application. Most client-server environments provided tools which made this easy to do. This data was only relevant for one particular session between the application and the database, so I call it session state. Essentially this provides a temporary local version of the data that the user works on until they save, or commit it, back to the database - at which point it merges with the record state. I won't worry about the issues around coordinating record state and session state here: I did go into various techniques in [P of EAA].
    • The final copy lies inside the GUI components themselves. This, strictly, is the data they see on the screen, hence I call it the screen state. It is important to the UI how screen state and session state are kept synchronized.

    Keeping screen state and session state synchronized is an important task. A tool that helped make this easier was Data Binding. The idea was that any change to either the control data, or the underlying record set was immediately propagated to the other. So if I alter the actual reading on the screen, the text field control effectively updates the correct column in the underlying record set.

    In general data binding gets tricky because if you have to avoid cycles where a change to the control, changes the record set, which updates the control, which updates the record set.... The flow of usage helps avoid these - we load from the session state to the screen when the screen is opened, after that any changes to the screen state propagate back to the session state. It's unusual for the session state to be updated directly once the screen is up. As a result data binding might not be entirely bi-directional - just confined to initial upload and then propagating changes from the controls to the session state.

    There are various ways of getting this kind of thing to work - the common one for client-server toolkits was the notion of events. Each control had a list of events it could raise. Any external object could tell a control that it was interested in an event - in which case the control would call that external object when the event was raised. Essentially this is just a rephrasing of the Observer pattern where the form is observing the control. The framework usually provided some mechanism where the developer of the form could write code in a subroutine that would be invoked when the event occurred. Exactly how the link was made between event and routine varied between platform and is unimportant for this discussion - the point is that some mechanism existed to make it happen.

    Ref. from Martin Fowler's Data Bingding

    A mechanism that ensures that any change made to the data in a UI control is automatically carried over to the underlying session state (and vice versa).

    网络资料

    qt-mvvmhttps://github.com/gpospelov/qt-mvvm

    Martin Fowler: GUI Architectureshttps://martinfowler.com/eaaDev/uiArchs.html

  • 相关阅读:
    虚拟机Linux如何做快照、备份以及快照的使用
    静态HTML CSS网站制作成品 简单的学生网页作业代码【带视频演示】
    MySQL过滤数据知识点 + 关键字DISTINCT + 牛客-SQL必知必会-03过滤数据篇:SQL67-70 + 04高级数据过滤篇:SQL71-74
    【6.824】分布式lab1 mapReduce
    最简单的git图解(多远程仓库)
    QT发送Get请求并返回内容
    图论第9天
    ThreadLocal之强、弱、软、虚引用
    数据结构——图
    frp实现内网穿透
  • 原文地址:https://blog.csdn.net/qq_26221775/article/details/126572863