Qt рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдореЙрдбрд▓

рдореИрдВ Qt MV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░, рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдкрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдЦ рдерд╛ред рд╣рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рднрд╛рдЧ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред

рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдкрд╛рдЯ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк QAbstractListModel рдФрд░ QAbstractTableModel рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рддрддреНрдкрд░рддрд╛ рдореЗрдВ рд▓рд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

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

рдЪрд┐рддреНрд░: рдЯреЗрдмрд▓ рдЗрди рдЯреЗрдмрд▓

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

рдбрд┐рдЬрд╝рд╛рдЗрди

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ 2 рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реВрдВрдЧрд╛:

рдбреЗрдЯрд╛ рд╕рдВрдЧрдарди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рд▓реЗрдЦ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбрд▓ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред

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

рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЙрдбрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QFileInfo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдФрд░ рдкреИрд░реЗрдВрдЯ рдиреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░рдиреА рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА рдпрд╛ рдирд╣реАрдВред

рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдбреЗрдЯрд╛ ( QFileInfo ) рдХреЛ рдУрд╡рд░рд╣реЗрдб рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдбреЗрдЯрд╛ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрджрд╛рдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдореВрд▓ рдбреЗрдЯрд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВ рдХреЗ рд╕рд╛рде рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реЗ рд╣реИрдВред

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрддрд░рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ:
 struct FilesystemModel::NodeInfo { QFileInfo fileInfo; //    QVector<NodeInfo> children; //    NodeInfo* parent; //     bool mapped; //     . }; 

рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреА рдореВрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдиреЛрдбреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рдЙрдирдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд▓реЛрдб рдХрд░реВрдВрдЧрд╛:
 typedef QVector<NodeInfo> NodeInfoList; NodeInfoList _nodes; //      

рдкреЗрдбрд╝ рдореЗрдВ рдХрдИ рд╕реНрддрдВрдн рд╣реЛрдВрдЧреЗ:
 enum Columns { RamificationColumn, // ,    ,  . //     QTreeView NameColumn = RamificationColumn, //     ModificationDateColumn, //      SizeColumn, //     ColumnCount //   }; 


рдПрдХ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдореЙрдбрд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ QAbstractItemModel рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд╛рдВрдЪ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
 virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; virtual QModelIndex parent(const QModelIndex &child) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╣рд▓реЗ рджреЛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдорддреМрд░ рдкрд░ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ 80% рд╣реИред рдпрд╣ рднреА рддрдереНрдп рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЗ (1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рд╣реИред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ internalPointer рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ NodeInfo рдореЗрдВ NodeInfo рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡реЗ рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВред index рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп index рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЧреИрд░-рдореМрдЬреВрдж рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕реА рд╕рдордп, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ hasIndex рдлрд╝рдВрдХреНрд╢рди рд╣реИред
 QModelIndex FilesystemModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } if (!parent.isValid()) { //     return createIndex(row, column, const_cast<NodeInfo*>(&_nodes[row])); } NodeInfo* parentInfo = static_cast<NodeInfo*>(parent.internalPointer()); return createIndex(row, column, &parentInfo->children[row]); } рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрддрдВрдн, QModelIndex рдФрд░ рдорд╛рддрд╛ рдкрд┐рддрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ) рд╕реНрдерд┐рд░рд╛рдВрдХ QModelIndex FilesystemModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } if (!parent.isValid()) { //     return createIndex(row, column, const_cast<NodeInfo*>(&_nodes[row])); } NodeInfo* parentInfo = static_cast<NodeInfo*>(parent.internalPointer()); return createIndex(row, column, &parentInfo->children[row]); } , рдорд╛рддрд╛ рдкрд┐рддрд╛)) { QModelIndex FilesystemModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); } if (!parent.isValid()) { //     return createIndex(row, column, const_cast<NodeInfo*>(&_nodes[row])); } NodeInfo* parentInfo = static_cast<NodeInfo*>(parent.internalPointer()); return createIndex(row, column, &parentInfo->children[row]); } 

parent рд╕рд╛рде parent рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ, рдЖрдк рд╣рдореЗрд╢рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж NodeInfo рдорд╛рддрд╛ рдкрд┐рддрд╛ рдорд╛рддрд╛ рдкрд┐рддрд╛ рддрддреНрд╡ рдХреЗ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рднреА "рднрд╛рдИ" рдХреЗ рдмреАрдЪ рдореЗрдВ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рдпрд╛ рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реЗ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдиреЛрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдиреЛрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕рдХреА рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбрд▓ рдореЗрдВ, рдореИрдВ рдЙрд╕ рдкрд╕рдВрдж рдкрд░ рддрдм рддрдХ рдЯрд┐рдХреВрдВрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдбрд╝рдЪрди рд╣реИред
 QModelIndex FilesystemModel::parent(const QModelIndex &child) const { if (!child.isValid()) { return QModelIndex(); } NodeInfo* childInfo = static_cast<NodeInfo*>(child.internalPointer()); NodeInfo* parentInfo = childInfo->parent; if (parentInfo != 0) { // parent      return createIndex(findRow(parentInfo), RamificationColumn, parentInfo); } else { return QModelIndex(); } } int FilesystemModel::findRow(const NodeInfo *nodeInfo) const { const NodeInfoList& parentInfoChildren = nodeInfo->parent != 0 ? nodeInfo->parent->children: _nodes; NodeInfoList::const_iterator position = qFind(parentInfoChildren, *nodeInfo); return std::distance(parentInfoChildren.begin(), position); } 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди rowCount рдФрд░ columnCount рддреБрдЪреНрдЫ: рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рдХреЗ рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ NodeInfo::children::size , рдЬрдмрдХрд┐ рддрдп рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
 int FilesystemModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) { return _nodes.size(); } const NodeInfo* parentInfo = static_cast<const NodeInfo*>(parent.internalPointer()); return parentInfo->children.size(); } int FilesystemModel::columnCount(const QModelIndex &) const { return ColumnCount; } 

data рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ QFileInfo рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА QFileInfo ред рдХрдо рд╕реЗ рдХрдо, рдЖрдкрдХреЛ Qt::DisplayRole рднреВрдорд┐рдХрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ view рдФрд░ Qt::EditRole рдореЗрдВ рдкрд╛рда рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛ рдХрд╛ рд╕рдорд░реНрдерди рд╣реЛ, рдпрджрд┐ рд╕рдВрдкрд╛рджрди рдЖрд╡рд╢реНрдпрдХ рд╣реЛред Qt::EditRole рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Qt::DisplayRole рдФрд░ Qt::EditRole рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд░рддреЗ рд╕рдордп рдореЙрдбрд▓ рдЬреЛ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╡рд╣ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рд╡рд┐рд╕реНрддрд╛рд░, рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ - рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рдеред
рдХреЛрдб рдбреЗрдЯрд╛ рд╕рдорд╛рд░реЛрд╣
 QVariant FilesystemModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } const NodeInfo* nodeInfo = static_cast<NodeInfo*>(index.internalPointer()); const QFileInfo& fileInfo = nodeInfo->fileInfo; switch (index.column()) { case NameColumn: return nameData(fileInfo, role); case ModificationDateColumn: if (role == Qt::DisplayRole) { return fileInfo.lastModified(); } break; case SizeColumn: if (role == Qt::DisplayRole) { return fileInfo.isDir()? QVariant(): fileInfo.size(); } break; default: break; } return QVariant(); } QVariant FilesystemModel::nameData(const QFileInfo &fileInfo, int role) const { switch (role) { case Qt::EditRole: return fileInfo.fileName(); case Qt::DisplayRole: if (fileInfo.isRoot()) { return fileInfo.absoluteFilePath(); } else if (fileInfo.isDir()){ return fileInfo.fileName(); } else { return fileInfo.completeBaseName(); } default: return QVariant(); } Q_UNREACHABLE(); } *> (index.internalPointer ()); QVariant FilesystemModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } const NodeInfo* nodeInfo = static_cast<NodeInfo*>(index.internalPointer()); const QFileInfo& fileInfo = nodeInfo->fileInfo; switch (index.column()) { case NameColumn: return nameData(fileInfo, role); case ModificationDateColumn: if (role == Qt::DisplayRole) { return fileInfo.lastModified(); } break; case SizeColumn: if (role == Qt::DisplayRole) { return fileInfo.isDir()? QVariant(): fileInfo.size(); } break; default: break; } return QVariant(); } QVariant FilesystemModel::nameData(const QFileInfo &fileInfo, int role) const { switch (role) { case Qt::EditRole: return fileInfo.fileName(); case Qt::DisplayRole: if (fileInfo.isRoot()) { return fileInfo.absoluteFilePath(); } else if (fileInfo.isDir()){ return fileInfo.fileName(); } else { return fileInfo.completeBaseName(); } default: return QVariant(); } Q_UNREACHABLE(); } 

рдореЙрдбрд▓ рдХреЛ рдЬреАрд╡рди рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП, рд░реВрдЯ рдиреЛрдбреНрд╕ рдХреЛ рднрд░рдирд╛ рдмрд╛рдХреА рд╣реИ:
 void FilesystemModel::fetchRootDirectory() { const QFileInfoList drives = QDir::drives(); qCopy(drives.begin(), drives.end(), std::back_inserter(_nodes)); } FilesystemModel::FilesystemModel(QObject *parent) : QAbstractItemModel(parent) { fetchRootDirectory(); } 


рдЕрдм рдЖрдк QTreeView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рд╣реИ! рдЬрдбрд╝ рддрддреНрд╡реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рд▓реЛрдб рдирд╣реАрдВ рд╣реИред

рдбреЗрдЯрд╛ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Qt рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд API рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 bool canFetchMore(const QModelIndex &parent) const; void fetchMore(const QModelIndex &parent); 

рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди true рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рджрд┐рдП рдЧрдП рдореВрд▓ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
NodeInfo::mapped рдХрд╛рдо рдЖрддрд╛ NodeInfo::mapped ред mapped == false рдЬрд╛рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ mapped == false ред
 bool FilesystemModel::canFetchMore(const QModelIndex &parent) const { if (!parent.isValid()) { return false; } const NodeInfo* parentInfo = static_cast<const NodeInfo*>(parent.internalPointer()); return !parentInfo->mapped; } NodeInfo *> (parent.internalPointer ()); bool FilesystemModel::canFetchMore(const QModelIndex &parent) const { if (!parent.isValid()) { return false; } const NodeInfo* parentInfo = static_cast<const NodeInfo*>(parent.internalPointer()); return !parentInfo->mapped; } 

рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ QDir ред рдЙрд╕реА рд╕рдордп, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓рддреЗ рд╕рдордп beginInsertRows рдФрд░ endInsertRows рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, QTreeView рдХрд░рддрд╛ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЗрд╡рд▓ рдЬрдм рддреБрдо рдиреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реВрдЪреА рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдирдП рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИред рд╕рд╣реА рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж, рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдШрдЯрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
 void FilesystemModel::fetchMore(const QModelIndex &parent) { NodeInfo* parentInfo = static_cast<NodeInfo*>(parent.internalPointer()); const QFileInfo& fileInfo = parentInfo->fileInfo; QDir dir = QDir(fileInfo.absoluteFilePath()); QFileInfoList children = dir.entryInfoList(QStringList(), QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); beginInsertRows(parent, 0, children.size() - 1); parentInfo->children.reserve(children.size()); for (const QFileInfo& entry: children) { NodeInfo nodeInfo(entry, parentInfo); nodeInfo.mapped = !entry.isDir(); parentInfo->children.push_back(std::move(nodeInfo)); } parentInfo->mapped = true; endInsertRows(); } , QDir :: AllEntries | QDir :: NoDotAndDotDot, QDir :: рдирд╛рдо); void FilesystemModel::fetchMore(const QModelIndex &parent) { NodeInfo* parentInfo = static_cast<NodeInfo*>(parent.internalPointer()); const QFileInfo& fileInfo = parentInfo->fileInfo; QDir dir = QDir(fileInfo.absoluteFilePath()); QFileInfoList children = dir.entryInfoList(QStringList(), QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); beginInsertRows(parent, 0, children.size() - 1); parentInfo->children.reserve(children.size()); for (const QFileInfo& entry: children) { NodeInfo nodeInfo(entry, parentInfo); nodeInfo.mapped = !entry.isDir(); parentInfo->children.push_back(std::move(nodeInfo)); } parentInfo->mapped = true; endInsertRows(); } 

Podgruzku, рдХрд╛рд░реНрдпрдХреНрд░рдо, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдБ - рдХреЛрдИред рд░реВрдЯ рдиреЛрдб рдХреЛ рднреА рддреИрдирд╛рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣реИ QTreeView рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ hasChildren рдиреЛрдб рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрд╛ рдорд╛рдирдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдиреЛрдбреНрд╕ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЗ рддрддреНрд╡ рд╣реИрдВ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред hasChildren рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рддрднреА true рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдореВрд▓ рдиреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред Reimplement hasChildren рддреЛ рдпрд╣ рд░рд┐рдЯрд░реНрди рдХрд┐ true рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЬрдм рдпрд╣ рдареАрдХ рд╣реИ рдпрд╛ (рдЬрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ mapped ==false рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕)ред

рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЦрд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЪрд╛рд╣реЗ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред
 bool FilesystemModel::hasChildren(const QModelIndex &parent) const { if (parent.isValid()) { const NodeInfo* parentInfo = static_cast<const NodeInfo*>(parent.internalPointer()); Q_ASSERT(parentInfo != 0); if (!parentInfo->mapped) { return true;//QDir(parentInfo->fileInfo.absoluteFilePath()).count() > 0; --   ,     } } return QAbstractItemModel::hasChildren(parent); } > fileInfo.absoluteFilePath ()) рдЧрд┐рдирддреА ()> bool FilesystemModel::hasChildren(const QModelIndex &parent) const { if (parent.isValid()) { const NodeInfo* parentInfo = static_cast<const NodeInfo*>(parent.internalPointer()); Q_ASSERT(parentInfo != 0); if (!parentInfo->mapped) { return true;//QDir(parentInfo->fileInfo.absoluteFilePath()).count() > 0; --   ,     } } return QAbstractItemModel::hasChildren(parent); } 

рдЕрдм рдореЙрдбрд▓ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо, рдлрд╝рд╛рдЗрд▓ рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдЬреЛрдбрд╝рдиреЗ рдлреЛрд▓реНрдбрд░ рдФрд░ рдЯреНрд░реИрдХ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░рд┐рд╡рд░реНрддрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реИрдмрд░ рдкрд░ рдЕрдиреБрдордд рд▓реЗрдЦ рд╕реЗ рдкрд░реЗ рд╣реИред рдореИрдВрдиреЗ GitHub рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред

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


All Articles