рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореЙрдбрд▓ рдЯреНрд░рд┐рдХ рд╕рд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬрд┐рд╕реЗ 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 рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рджреЛ рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдХреЛ рдПрдХ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдФрд░ рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
рд╣рдорд╛рд░рд╛ рдкреБрдирд░реНрд╡рд┐рдХреНрд░реЗрддрд╛ рдореЙрдбрд▓ рдПрдХ рджреЛ-рд╕реНрддрд░реАрдп рд╡реГрдХреНрд╖ рдореЙрдбрд▓ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ (..) рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ (..) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдкреЗрдбрд╝ рдХрд╛ рдореЙрдбрд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
(рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдореЙрдбрд▓ рдФрд░ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рдореЗрдВ рдХреЙрд▓рдо рдХреА рд╕рдВрдЦреНрдпрд╛ = 1 рд╣реЛрдЧреА)
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрдВрдХреНрддрд┐-рдирд┐рд░реНрдзрд╛рд░рдг (....) рдФрд░ рд╕реНрддрдВрдн-рдЪрд┐рд╣реНрди (.....) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
int ModelJoinerProxy::rowCount(const QModelIndex &parent) const { int count = 0;
рдЕрдм рдордЬрд╝реЗ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдХрд░ рд╕рдХреЗрдВ
рдЖрдкрд╕ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВред
рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ (...) рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рдЕрднреНрдпрд╛рд╡реЗрджрди (рдФрд░ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдХреЛ рдбреЗрдЯрд╛ рджреЗ рд╕рдХреЗред
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 рдХреЗ рд╕рд╛рде рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЗ рджрд░реНрдЬрдиреЛрдВ рд╕рдорд╛рди рдореЙрдбрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рдордзреНрдпрд╕реНрде рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдореВрд╣ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ, рдЖрджрд┐ред
рдЖрдкрдХреЗ рдзреИрд░реНрдп рдФрд░ рдЕрдкреВрд░рдгреАрдп рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП
рдпрд╢реБрд░рд┐рдХ рдХреЛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред