Форум сайта python.su
Здравствуйте..
Пытаюсь вникнуть в модель MVC. Тренируюсь на приложении для работы с бд с PyQt интерфейсом.
Создал 3 класса (model, controller, view)
import sys
import view
import model
from PyQt4 import QtGui
class myContr():
def __init__(self):
pass
def createView(self):
myview = view.myView()
return myview
def createModel(self):
mymodel = model.myModel()
return mymodel
if __name__ == "__main__":
# создание объекта приложения
app = QtGui.QApplication(sys.argv)
# создание контроллера
contr = myContr()
# создание представления
view = contr.createView()
# создание модели
model = contr.createModel()
# запуск цикла обработки событий
sys.exit(app.exec_())
Офлайн
Задачу надо практическую, а не абстрактную, тогда и видно будет.
Офлайн
Обычно, всё-таки, контроллер должен знать про вью и модель.
Опять же – вью должна знать про модель.
Подумай, как организовать классическую схему
Офлайн
Не могу понять как организовать взаимодействие между классами..
В мануале говорится, что на действия пользователя должен не реагировать Controller, но пользователь то взаимодействует с интерфейсом (View). Не легче объединить View и Controller?
Офлайн
вот примерчик
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
# create table
table = self.createTable()
# layout
layout = QVBoxLayout()
layout.addWidget(table)
self.setLayout(layout)
def createTable(self):
# create the view
tv = QTableView()
# set the table model
tm = MyTableModel(self)
tv.setModel(tm)
# set the minimum size
tv.setMinimumSize(400, 300)
# hide gridnt()
#tv.setShowGrid(False)
# set the font
font = QFont("Courier New", 8)
tv.setFont(font)
# hide vertical header
vh = tv.verticalHeader()
vh.setVisible(False)
# tv.sizeHintForRow(101)
# set horizontal header properties
hh = tv.horizontalHeader()
hh.setStretchLastSection(True)
# set column width to fit contents
# tv.resizeColumnsToContents()
# set row height
# nrows = tm.rowCount(self)
# for row in xrange(nrows):
# tv.setRowHeight(row, 15)
return tv
class MyTableModel(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
def rowCount(self, parent):
#кол-во строк
return 1000000
def columnCount(self, parent):
#кол-во колонок
return 4
def data(self, index, role):
##тут фунция вытягивания данных
if not index.isValid():
return QVariant()
elif role != Qt.DisplayRole:
return QVariant()
## для отладки-можно видеть обращения к функции
# print QString(u"клетка ")+str(index.row())+"-"+str(index.column())
return QVariant(QString(u"клетка ")+str(index.row())+"-"+str(index.column()))
def headerData(self, col, orientation, role):
## тут задаются заголовки
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(QString(u"Колонка ")+str(col))
return QVariant()
if __name__ == "__main__":
main()
Офлайн