В MVC/MVP у вас будет разделение на Модель (класс или набор классов, всякие там User, PriceList и т.д.), которая отражает состояние базы, и Вид (классы PyQT, окна и элементы гуи, всякие текстбоксы, чекбоксы и т.д.), который отражает состояние Модели.
При инициализации приложения Модель делает SQL запрос к базе и выстраивает свое состояние. То есть запоминает полученные данные в полях, создает при необходимости дополнительные объекты и т.д.
После того как Модель проинициализирована создается графический интерфейс, то есть Вид. У Вида есть ссылка на Модель. Вид собирает данные у Модели и отображает их в виджетах. Помимо этого Вид подписывается на изменения в Модели.
Когда пользователь нажал “сохранить”, то Вид проверяет валидность введенных данных и обновляет Модель. Модель при обновлении делает SQL Update, сохраняя свое состояние в базу.
Если в Модели происходят изменения, то она уведомляет своих подписчиков о них. Это уведомление получает подписанный Вид и соответствующим образом обновляет состояние виджетов.
В MVC/MVP есть соответственно Контроллер/Представитель, который стоит между Моделью и Видом и отвечает за валидацию данных, за реакцию на нажатие кнопок и т.д. Их роль может варьироваться и остается за разработчиком. Например “пассивный” Вид вообще ничего не проверяет и умеет только менять состояние виджетов и транслировать наверх события типа нажатия кнопок (то есть Контроллеру или Представителю, которые уже общаются с Моделью). Активный Вид более “умный”, он может и сам как-то реагировать на события.
Ссылки на
Фаулера и
эту статью возможно будут полезными.