Уведомления

Группа в Telegram: @pythonsu

#1 Март 13, 2017 11:00:30

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

Помогите переписать пример, нужно для дальнейшего понимания.

  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)

Насколько я понимаю, данный кусок кода на python не переводится (объявление методов класса)
      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;
В общем помогите разобраться.

Офлайн

#2 Март 13, 2017 11:14:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

зачем их переписывать?

 >>> 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
если ты хочешь сделать свою модель, наследуйся от QStringListModel и добавляй свой функционал

Отредактировано vic57 (Март 13, 2017 11:24:18)

Офлайн

#3 Март 13, 2017 11:25:37

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

vic57
зачем их переписывать?
По доке идет переопределение методов, а для чего и самому интересно

Офлайн

#4 Март 13, 2017 11:37:32

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

в с++ есть объявление(декларация) и реализация. ты прочитал декларации, дочитай до реализации
http://qtdocs.narod.ru/4.1.0/doc/html/model-view-creating-models.html

Офлайн

#5 Март 13, 2017 11:47:48

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

vic57
ты прочитал декларации, дочитай до реализации
Все верно, но у меня возник вопрос именно как на python будет выглядеть декларирование, а именно как будет выглядеть __init__, ладно будем читать дальше и соберу весь исходник на C++ в кучу, чтоб наглядней было.

Офлайн

#6 Март 13, 2017 11:55:13

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

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)

Офлайн

#7 Март 13, 2017 12:16:28

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

Уфф… спасибо!
Сейчас начало проясняться, все не мог догнать куда сунуть переменную stringList (то что она приватная на python не нужно указывать?).
Еще заметил у вас в методе data у аргумента index есть определение типа QModelIndex - это опечатка или так и должно быть?
QObject *parent = 0 - не нужно указывать? там вроде по дефолту None
Извиняюсь за такие дурацкие вопросы, но изучаю между основной работой и в голове не всегда все сразу встает на свои места.

Отредактировано MrViktor (Март 14, 2017 07:39:12)

Офлайн

#8 Март 13, 2017 12:23:39

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

в питоне нет приватных переменных
ModelIndex нужен, смотри реализацию по ссылке
parent - можешь указать, я тут не вижу необходимости

Офлайн

#9 Март 13, 2017 12:46:38

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

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)

Офлайн

#10 Март 13, 2017 13:05:17

MrViktor
Зарегистрирован: 2017-03-09
Сообщения: 83
Репутация: +  8  -
Профиль   Отправить e-mail  

Пример Qt4 с C++ на python 3

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);
 }

У меня вышел вот такой на python3
 #!-*-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_())

Это с учетом нового sip v2, нет QString и QVariant. Не понял как прикрепить файл ui, но там ничего особенного, в дизайнере создаете форму с одним виджетом QListView
Вдруг кому пригодится для понимания.

Отредактировано MrViktor (Март 14, 2017 14:08:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version