Форум сайта python.su
Помогите переписать пример, нужно для дальнейшего понимания.
class StringListModel : public QAbstractListModel { Q_OBJECT public: StringListModel(const QStringList &strings, QObject *parent = 0) : QAbstractListModel(parent), stringList(strings) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; private: QStringList stringList; };
class StringListModel(QAbstractItemModel): def __init__(self, parent=None): QAbstractItemModel.__init__(self, parent=0)
int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
Офлайн
зачем их переписывать?
>>> from PyQt4.Qt import * >>> help(QStringListModel) Help on class QStringListModel in module PyQt4.QtGui: class QStringListModel(PyQt4.QtCore.QAbstractListModel) | QStringListModel(QObject parent=None) | QStringListModel(QStringList, QObject parent=None) | | Method resolution order: | QStringListModel | PyQt4.QtCore.QAbstractListModel | PyQt4.QtCore.QAbstractItemModel | PyQt4.QtCore.QObject | sip.wrapper | sip.simplewrapper | __builtin__.object | | Methods defined here: | | data(...) | QStringListModel.data(QModelIndex, int) -> QVariant | | flags(...) | QStringListModel.flags(QModelIndex) -> Qt.ItemFlags | | insertRows(...) | QStringListModel.insertRows(int, int, QModelIndex parent=QModelIndex()) -> bool | | removeRows(...) | QStringListModel.removeRows(int, int, QModelIndex parent=QModelIndex()) -> bool | | rowCount(...) | QStringListModel.rowCount(QModelIndex parent=QModelIndex()) -> int | | setData(...) | QStringListModel.setData(QModelIndex, QVariant, int role=Qt.EditRole) -> bool
Отредактировано vic57 (Март 13, 2017 11:24:18)
Офлайн
vic57По доке идет переопределение методов, а для чего и самому интересно
зачем их переписывать?
Офлайн
в с++ есть объявление(декларация) и реализация. ты прочитал декларации, дочитай до реализации
http://qtdocs.narod.ru/4.1.0/doc/html/model-view-creating-models.html
Офлайн
vic57Все верно, но у меня возник вопрос именно как на python будет выглядеть декларирование, а именно как будет выглядеть __init__, ладно будем читать дальше и соберу весь исходник на C++ в кучу, чтоб наглядней было.
ты прочитал декларации, дочитай до реализации
Офлайн
MrViktorдеклараций тут не надо
Все верно, но у меня возник вопрос именно как на python будет выглядеть декларирование, а именно как будет выглядеть __init__, ладно будем читать дальше и соберу весь исходник на C++ в кучу, чтоб наглядней было.
class MyList(QAbstractListModel): def __init__(self,parent=None): QAbstractListModel.__init__(self) self.stringList = QStringList() def data(self,QModelIndex index, role): if index.isValid(): #etc
Отредактировано vic57 (Март 13, 2017 12:13:51)
Офлайн
Уфф… спасибо!
Сейчас начало проясняться, все не мог догнать куда сунуть переменную stringList (то что она приватная на python не нужно указывать?).
Еще заметил у вас в методе data у аргумента index есть определение типа QModelIndex - это опечатка или так и должно быть?
QObject *parent = 0 - не нужно указывать? там вроде по дефолту None
Извиняюсь за такие дурацкие вопросы, но изучаю между основной работой и в голове не всегда все сразу встает на свои места.
Отредактировано MrViktor (Март 14, 2017 07:39:12)
Офлайн
в питоне нет приватных переменных
ModelIndex нужен, смотри реализацию по ссылке
parent - можешь указать, я тут не вижу необходимости
Офлайн
ModelIndex не нужен в реализации
class Model(QAbstractListModel): def __init__(self,parent=None): QAbstractListModel.__init__(self,parent) self.stringList = QStringList() def data(self,index,role=Qt.DisplayRole): return self.stringList[index] if __name__=="__main__": m = Model() m.stringList = QStringList(['null','one','two','three']) print m.data(1)
Офлайн
vic57Спасибо за поправку, а то я чет “затупил” над фразой “ModelIndex нужен, смотри реализацию по ссылке”
ModelIndex не нужен в реализации
class StringListModel : public QAbstractListModel { Q_OBJECT public: StringListModel(const QStringList &strings, QObject *parent = 0) : QAbstractListModel(parent), stringList(strings) {} int rowCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; private: QStringList stringList; }; int StringListModel::rowCount(const QModelIndex &parent) const { return stringList.count(); } QVariant StringListModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (index.row() >= stringList.size()) return QVariant(); if (role == Qt::DisplayRole) return stringList.at(index.row()); else return QVariant(); } QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) return QString("Column %1").arg(section); else return QString("Row %1").arg(section); }
#!-*-coding:utf-8-*- import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4 import uic (Ui_MainWindow, QMainWindow) = uic.loadUiType('ex3.ui') class MainWindow(QMainWindow): """MainWindow inherits QMainWindow""" def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) def __del__(self): self.ui = None pass class StringListModel(QAbstractListModel): def __init__(self, strings): QAbstractListModel.__init__(self) self._stringList = strings def rowCount(self, parent=None): return len(self._stringList) def data(self, index, role): if not index.isValid(): return None if index.row() >= len(self._stringList): return None if role == Qt.DisplayRole: return self._stringList[index.row()] else: return None pass def headerData(self, selection, orentation, role): if role != Qt.DisplayRole: return None if orentation == Qt.Horizontal: return 'Column %s'%selection else: return 'Row %s'%selection #-----------------------------------------------------# if __name__ == '__main__': # create application app = QApplication(sys.argv) app.setApplicationName('test_my') numbers = ["One", "Two", "Three", "Four", "Five"] model = StringListModel(numbers) # create widget w = MainWindow() w.setWindowTitle('test_my') w.ui.listView.setModel(model) w.show() firstTableView = QTableView() firstTableView.setModel(model) firstTableView.show() # connection QObject.connect(app, SIGNAL('lastWindowClosed()'), app, SLOT('quit()')) # execute application sys.exit(app.exec_())
Отредактировано MrViktor (Март 14, 2017 14:08:20)
Офлайн