我正在尝试使用PyQt设计MVC模式。 我希望将所有程序拆分为3个部分:
- 抽象自所有Qt类的类(模型)
- 从模型提供数据给Qt应用程序的类(控制器)
- 具有定义方法SignalsToSlots的Qt应用程序,该方法将信号与控制器连接。
这是最优的吗?在PyQt开发中推荐使用什么方案?
首先,你需要使用Qt4 designer设计GUI并使用pyuic4生成Python GUI。这将成为您的视图,您永远不要手动编辑这些Python文件。一定要使用设计师进行更改,这样可以确保您的视图与您的模型和控件分离。
对于控件元素,请创建一个从基本GUI小部件(例如QMainWindow)继承的中央类。然后,该对象将包含一个名为ui的成员,它是您刚生成的视图对象。
以下是来自教程的示例:
更新2013年:这里有关于PyQt和MVC模型的更多最新教程: PyQt MVC教程系列
import sys
from PyQt4 import QtCore, QtGui
from edytor import Ui_notepad
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_notepad()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())
class Movie():
def __init__(self,title=None,year=None,genre=None):
self.title=title
self.year=year
self.genre=genre
def update(self,title=None,year=None,genre=None):
self.title=title
self.year=year
self.genre=genre
def to_xml(self,title=None,date=None,genre=None):
pass #not implementing this for an example!
#when the controller tries to update it should use update function
movie1.update("Manos Hands Of Fate",1966,"Awesome")
#don't set by direct access, your controller shouldn't get that deep
movie1.title="Bad Idea" #do not want!
QSortFilterProxyModel
)进行连接。 - abbothttp://doc.qt.io/qt-5/model-view-programming.html
在Qt中,视图和控制器被合并在一起,因此可以使用Model-View框架设计应用程序。...
模型、视图和代理之间使用信号和槽进行通信
from peewee import *
from pathlib import Path
import datetime
import os
root_path = Path(__file__).resolve().parent
db_path = os.path.join(root_path, 'db', 'db.sqlite3')
db = SqliteDatabase(db_path)
class BaseModel(Model):
class Meta:
database = db
class Categorie(BaseModel) :
name = CharField(max_length=64, unique=True, null=False)
class Product(BaseModel) :
code = CharField(max_length=20, unique=True, null=False)
name = CharField(max_length=128, unique=True, null=False)
mark = CharField(max_length=128, unique=True, null=False)
model = CharField(max_length=128, unique=True, null=False)
category = ForeignKeyField(Categorie, null=False)
image_path = CharField(max_length=1024, null=True)
self._title=title; self._year=year; ...
,也建议遵循最佳实践,通过类中专门的方法来设置属性值。 - mlvljr