qt for python mvc,PyQt和MVC模式

首先要做的事情之一是使用Qt4设计器设计gui,并使用pyuic4生成pythongui。这将是您的视图,您永远不会手工编辑这些python文件。始终使用设计器进行更改,这将确保视图与模型和控件分离。

对于控件元素,创建一个中心类,该类继承自基本的gui小部件,如QMainWindow。然后这个对象将包含一个成员ui,它是您刚刚生成的视图对象。

2013年更新:以下是关于PyQt和MVC模型的最新教程

PyQt MVC Tutorial Seriesimport 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_())

上面例子中的关键点是控制器包含ui,而不是直接继承它。控制器将负责管理gui的信号插槽连接,并为数据模型提供接口。

为了描述模型部分,我们需要一个示例,假设您的项目是创建一个电影集合数据库。模型将包括表示单个电影的内部对象,以及表示电影列表的对象。控件将从视图中获取输入的数据并捕获信号,然后在要求模型更新自身之前验证它们。这一部分至关重要,控制器不应该直接访问模型,如果可能的话,它应该要求模型访问自己。

下面是这个交互的一个小例子(未经测试,可能是一些拼写错误):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!

在MVC中,集中访问也很重要,比如用户可以通过双击屏幕上的标题或单击标题字段旁边的“编辑”来更改标题,这些界面中的两个最终应该使用相同的方法进行更改。我不是说每个人都叫电影。更新标题。我的意思是两个信号在控制器中应该使用相同的方法。

尽可能多地使视图和控制器之间的所有关系为多对1。也就是说,你有5种方法可以在gui中改变某些东西,在控制器中有1种方法可以处理这个问题。如果插槽不完全兼容,请为每个方法创建方法,然后调用一个方法。如果您为5种视图样式解决了5次这个问题,那么实际上没有理由将视图与控件分开。另外,由于您现在只有一种方法可以在控制器中执行某些操作,因此在控制和模型之间有一个很好的1:1关系。

至于让你的模型与Qt完全分离,这并不是真正必要的,而且可能会让你的生活更艰难。在模型中使用qstring之类的东西可能很方便,如果在另一个应用程序中不需要Gui的开销,但希望模型只导入QtCore。希望这能有帮助!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值