Qt рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЯреНрд░рд┐рдХреНрд╕

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореЙрдбрд▓ рдЯреНрд░рд┐рдХ рд╕рд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ Qt MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд╛рд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ред


рджреЛ-рд╕реНрддрд░реАрдп рд╡реГрдХреНрд╖ рдореЙрдбрд▓:
|Parent 1 -----Child 1 -----Child N |Parent N -----Child 1 -----Child N 


рд╕реВрдЪреА рдореЙрдбрд▓:
 Item1 Item2 Item3 


рдЪрд╛рд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рджреЛ рд╕реЗ рдКрдкрд░ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдПрдХ рдореЙрдбрд▓ рдорд┐рд▓рддрд╛ рд╣реИ:
 |Parent 1 ------Child 1 ------Child N |Parent N ------Child 1 ------Child N |Item1 |Item2 |Item3 


рдЖрдЗрдП рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред


рдФрд░ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ QAbstractProxyModel рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдирд╣реАрдВ! рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдирдХ QAbstractProxyModel рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд░реЛрдд рдореЙрдбрд▓ (рдЬреЛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ) рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ ModelJoinerProxy рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рджреЛ рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдХреЛ рдПрдХ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдФрд░ рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 //  QAbstractItemModel     //   Qt class ModelJoinerProxy : public QAbstractItemModel { Q_OBJECT public: ModelJoinerProxy(QObject *parent = 0); QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &child) const; int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; //     1   virtual void setSourceModel1(QAbstractItemModel *sourceModel1); //     2   virtual void setSourceModel2(QAbstractItemModel *sourceModel2); //         virtual QModelIndex mapToSource(const QModelIndex &) const; //         virtual QModelIndex mapFromSource(const QModelIndex &) const; private slots: void source_dataChanged(QModelIndex, QModelIndex); void source_rowsAboutToBeInserted(QModelIndex p, int from, int to); void source_rowsInserted(QModelIndex p, int, int); void source_rowsAboutToBeRemoved(QModelIndex, int, int); void source_rowsRemoved(QModelIndex, int, int); void source_modelReset(); private: QAbstractItemModel *m1; QAbstractItemModel *m2; }; 


рд╣рдорд╛рд░рд╛ рдкреБрдирд░реНрд╡рд┐рдХреНрд░реЗрддрд╛ рдореЙрдбрд▓ рдПрдХ рджреЛ-рд╕реНрддрд░реАрдп рд╡реГрдХреНрд╖ рдореЙрдбрд▓ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ (..) рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ (..) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдкреЗрдбрд╝ рдХрд╛ рдореЙрдбрд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
(рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдФрд░ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рдореЗрдВ рдХреЙрд▓рдо рдХреА рд╕рдВрдЦреНрдпрд╛ = 1 рд╣реЛрдЧреА)
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрдВрдХреНрддрд┐-рдирд┐рд░реНрдзрд╛рд░рдг (....) рдФрд░ рд╕реНрддрдВрдн-рдЪрд┐рд╣реНрди (.....) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 int ModelJoinerProxy::rowCount(const QModelIndex &parent) const { int count = 0; //1  if (!parent.isValid()) count = m1->rowCount() + m2->rowCount(); //2  else if (parent.internalId() == -1) { //            m1 , //         if ( parent.row() < m1->rowCount() ) count = m1->rowCount( m1->index(parent.row(),0) ); //                 //            else if ( parent.row() > (m1->rowCount()-1) && parent.row() < (m1->rowCount() + m2->rowCount()) ) count = m2->rowCount(m2->index(parent.row()-m1->rowCount(), 0)); } return count; } int ModelJoinerProxy::columnCount(const QModelIndex &parent) const { return 1; } 


рдЕрдм рдордЬрд╝реЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдХрд░ рд╕рдХреЗрдВ
рдЖрдкрд╕ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВред

 //         QModelIndex ModelJoinerProxy::mapToSource(const QModelIndex & proxy) const { //       if ( proxy.row() < m1->rowCount() && !proxy.parent().isValid()) { return m1->index(proxy.row(),0) ; } //       if ( proxy.parent().isValid()) { return m1->index(proxy.row(),0, m1->index( proxy.parent().row(),0) ); } //     if ( proxy.row() > (m1->rowCount()-1) && proxy.row() < (m1->rowCount() + m2->rowCount()) ) { int offset = (proxy.row() - m1->rowCount()); return m2->index(offset, 0); } return QModelIndex(); } //        QModelIndex ModelJoinerProxy::mapFromSource(const QModelIndex &source) const { QModelIndex proxy; if (source.model() == m1) { //    if (!source.parent().isValid()) { proxy = index(source.row(), 0); } //    else { QModelIndex source_parent = index(source.parent().row() ,0); proxy = index(source.row(), 0, source_parent); } } //  if (source.model() == m2) { int offset = m1->rowCount() + source.row(); proxy = index(offset, 0); } return proxy; } 


рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ (...) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдЕрднреНрдпрд╛рд╡реЗрджрди (рдФрд░ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдХреЛ рдбреЗрдЯрд╛ рджреЗ рд╕рдХреЗред

 QVariant ModelJoinerProxy::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); return mapToSource(index).data(role); } 


рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рд╕рдВрдЧрдд рд╕реНрд▓реЙрдЯ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 void ModelJoinerProxy::setSourceModel1(QAbstractItemModel *sourceModel1) { m1 = sourceModel1; connect(m1, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(source_dataChanged(QModelIndex,QModelIndex))); ........ void ModelJoinerProxy::setSourceModel2(QAbstractItemModel *sourceModel2) { m2 = sourceModel2; connect(m2, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(source_dataChanged(QModelIndex,QModelIndex))); ........ 


рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

 void ModelJoinerProxy::source_dataChanged(QModelIndex tl, QModelIndex br) { QModelIndex p_tl = mapFromSource(tl); QModelIndex p_br = mapFromSource(br); emit dataChanged(p_tl, p_br); } 


рдЦреИрд░, рдпрд╣ рд╕рдм рд╣рдорд╛рд░рд╛ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдХреЛ рдЗрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдк рд╕реЗрдЯрдбреЗрдЯрд╛ (...) рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдирд┐рд╖реНрдХрд░реНрд╖


рдФрд░ рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдореБрдЭреЗ рд╕рд╣реА рд╢рдмреНрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░реАрдм рд╡рд╣ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЫреБрдЖ рд╣реИ, рд╣рд░ рдХреЛрдИ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 15 рдкреНрд░реЙрдХреНрд╕реА рдореЙрдбрд▓ (рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд + рдорд╛рдирдХ) рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИред рдкреНрд░реЙрдХреНрд╕реА рдореЙрдбрд▓ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд▓реЗрдЧрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдзрд┐рдХ рдмрдЧ, рдореЙрдбрд▓ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдВ, рдЖрджрд┐ред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреНрдпреВрдЯреА рдореЗрдВ рдПрдорд╡реАрд╕реА рдкрд░ рдПрдХ рдирдпрд╛ рд░реВрдк рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрдкрдиреЗ рдЬреАрдпреВрдЖрдИ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдмрджрд▓рдирд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, MVC Qt рдХреЗ рд╕рд╛рде рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЗ рджрд░реНрдЬрдиреЛрдВ рд╕рдорд╛рди рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдореВрд╣ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ, рдЖрджрд┐ред

рдЖрдкрдХреЗ рдзреИрд░реНрдп рдФрд░ рдЕрдкреВрд░рдгреАрдп рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдпрд╢реБрд░рд┐рдХ рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In126995/


All Articles