рдкрд░рд┐рдЪрдп
рд▓реЗрдЦ рдореЗрдВ C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП C ++ рдореЗрдВ рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рдЖрд▓рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ Qt рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ QObject
рд╡рд░реНрдЧ рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рджреГрд╢реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд▓рд╕реА рдФрд░ рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИред
рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдореИрдВ Qt рдХрдВрдкрдиреА рдХреЗ рдирд╛рд░реНрд╡реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдПрдХ рд╡рд░рд┐рд╖реНрда рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдБред рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Qt Core, рд╡рд┐рдЧреЗрдЯреНрд╕ рдФрд░ QtQuick рдПрд▓рд┐рдореЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ C ++ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдереЛрдбрд╝реА рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВред рдХрднреА-рдХрднреА рдореИрдВ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рд▓реЗрдЦ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред
Qt рдХреНрдпрд╛ рд╣реИ
Qt рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (GUI) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред GUI рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, Qt рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдлреНрд░реЗрдорд╡рд░реНрдХ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рдШрдЯрдХ QML рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
QObject рдХрдХреНрд╖рд╛
QObject рд╡рд╣ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ Qt рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред QObject
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрд▓реЙрдЯ рд╕рд┐рдЧреНрдирд▓ рдореЙрдбрд▓ рдФрд░ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, QObject
рдЖрдкрдХреЛ рдореЗрдЯрд╛-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЯреНрд░реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
QObject рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛
рдЯреНрд░реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ QObject
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдмрдЪреНрдЪреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓ рд╡рд╕реНрддреБ рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рджреЛ рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
auto parent = std::make_unique<QObject>(); auto onDestroyed = [](auto obj){ qDebug("Object %p destroyed.", obj); }; QObject::connect(new QObject(parent.get()), &QObject::destroyed, onDestroyed); QObject::connect(new QObject(parent.get()), &QObject::destroyed, onDestroyed);
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдм рддрдХ Qt API рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж рдЬрд▓реНрдж рд╣реА рд╕реНрдерд┐рддрд┐ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рдПрдЧреАред
QObject
рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреА рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
auto parent = std::make_unique<QObject>();
QObject::children
рдореЗрдердб, рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдорд╛рдирджрдВрдб рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреВрд░реЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдЦреЛрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
auto children = parent->findChildren<QObject>(QRegularExpression("0$")); qDebug() << children.count();
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ QObject
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрди рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреА рд╕реВрдЪреА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА QObject
рдЬрд┐рдирдХрд╛ рдирд╛рдо 0. рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред children
рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд, findChildren
рд╡рд┐рдзрд┐ рдкреЗрдбрд╝ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ Qt::FindDirectChildrenOnly
рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдиреБрдХрд╕рд╛рди
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдФрд░ рд▓рдЪреАрд▓рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
- рдирд┐рд░рд░реНрдердХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ findChildren
рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ (рдмрд╣реБрдд рдкрд╣рд▓реЗ рддреАрди рдирд╣реАрдВ рдереЗ): рдПрдХ рдЖрдЗрдЯрдо рдФрд░ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП findChild
рд╡рд┐рдзрд┐ред рд╡реЗ рд╕рднреА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВред - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
Qt рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдФрд░ рдПрдХрд▓ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧрддрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирдП рддрд░реАрдХреЗ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
рд╕рдВрдЧрддрддрд╛ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдмрдирд╛рдиреА рд╣реЛрдЧреАред - рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдирдХрд▓ рдХрд░реЗрдВ
рдЕрдХреНрд╕рд░, рдЖрдкрдХреЛ рдмрд╕ рджрд┐рдП рдЧрдП рдорд╛рдирджрдВрдб рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рд╕рднреА рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред - рд╕рдВрднрд╛рд╡рд┐рдд рдПрд╕рдЖрд░рдкреА рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди
рдпрд╣ рдПрдХ рдмрд▓реНрдХрд┐ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдореБрджреНрджрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдмрдЪреНрдЪреЛрдВ рдХреЛ рдлрдВрд╕рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИред
рдХреБрдЫ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдЬ-рд╡реА 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд░реЗрдВрдЬ-рд╡реА 3 рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рддрддреНрд╡реЛрдВ рдХреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдд рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдЪрд╛рд▓рди рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЛрдгрд╛рддреНрдордХ рд╕рдорд╛рдпреЛрдЬрди рдХрд╛ рд▓рд╛рдн рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд▓реЗрдЦрдХ рдХреЛ рдЬреНрдЮрд╛рдд рдХреЛрдИ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рд╣реИрдВред рд╢рд╛рдпрдж рд╕реНрдерд┐рддрд┐ рдЬрд▓реНрдж рд╣реА рдмрджрд▓ рдЬрд╛рдПрдЧреАред
QObject
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдХрдХреНрд╖рд╛ рд╕реЗ рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХреЛ QObject
рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА, рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд░рдВрдЧ-рд╡реА 3 рдЙрджрд╛рд╣рд░рдг
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдиреЛрдЯреЗрд╢рди рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ:
namespace r = ranges; namespace v = r::views; namespace a = r::actions;
рдЕрдм рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд░рд┐рд╡рд░реНрд╕ рдХреНрд░рдо рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ [1, 10) рдореЗрдВ рд╕рднреА рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдХреНрдпреВрдмреНрд╕ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:
auto is_odd = [](int n) { return n % 2 != 0; }; auto pow3 = [](int n) { return std::pow(n, 3); };
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдЧрдгрдирд╛ рдЖрд▓рд╕реА рд╣реЛрддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рдЕрд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рдП рдпрд╛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдКрдкрд░ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд░реЗрдВрдЬ-v3 рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ tests
рдФрд░ examples
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдмрдЪреНрдЪреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛
range-v3
рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рднрд┐рдиреНрди рдХрд╕реНрдЯрдо рдЖрд╡рд░рдг рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ; рдЙрдирдореЗрдВ рд╕реЗ view
рд╡рд░реНрдЧ рд╕реЗ рд╡рд░реНрдЧ рд╣реИрдВред рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдиреБрдХреНрд░рдо рд╕реНрд╡рдпрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдФрд░ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, filter
рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЙрди рддрддреНрд╡реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдирджрдВрдбреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред
QObject рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдХрдХреНрд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреА ranges::view_facade
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ranges::view_facade
namespace qt::detail { template <class T = QObject> class children_view : public r::view_facade<children_view<T>> {
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ end_cursor
рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рдХрд░реНрд╕рд░ рд╡рд░реНрдЧ рдХреЛ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ children_view
рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рд╣рд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
struct cursor {
рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реНрд╕рд░ рд╕рд┐рдВрдЧрд▓-рдкрд╛рд╕ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рддрдиреА рдмрд╛рд░ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреА рдмрд╛рд░ рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рдореЗрдВ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдХрдИ рдмрд╛рд░ рдХрд┐рд╕реА рдХреНрд░рдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХреЛ рдХрд░реНрд╕рд░ рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
auto equal(const cursor &that) const { return current_index == that.current_index; }
рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмрдирд╛рдП рдЧрдП рджреГрд╢реНрдп рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди ranges::make_pipeable
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ranges::make_pipeable
:
namespace qt { constexpr auto children = r::make_pipeable([](auto &&o) { return detail::children_view(o); }); constexpr auto find_children(Qt::FindChildOptions opts = Qt::FindChildrenRecursively) { return r::make_pipeable([opts](auto &&o) { return detail::children_view(o, opts); }); } }
рдЕрдм рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
for (auto &&c : root | qt::children) {
рдореМрдЬреВрджрд╛ QObject рдХрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдкреНрд░рд╕реНрддреБрддрд┐ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
namespace qt { template <class T> const auto with_type = v::filter([](auto &&o) { using ObjType = std::remove_cv_t<std::remove_pointer_t<T>>; return ObjType::staticMetaObject.cast(o); }) | v::transform([](auto &&o){ return static_cast<T>(o); }); auto by_name(const QString &name) { return v::filter([name](auto &&obj) { return obj->objectName() == name; }); } auto by_re(const QRegularExpression &re) { return v::filter([re](auto &&obj) { return re.match(obj->objectName()).hasMatch(); }); } }
рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
for (auto &&c : root | qt::children | qt::with_type<Foo*>) {
рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рд╕реЗ рдЖрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣, рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдХреЛ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХреЙрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХрд╛ рдЖрд▓рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
Coroutines (coroutines) рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдЖрд░рд╛рдорджрд╛рдпрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡реЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдХреИрдкреНрдкреЛрд░реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдХ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЕрдЧрд▓реЗ рдмрдЪреНрдЪреЗ рдХреА рдорд╛рдВрдЧ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ:
namespace qt::detail { cppcoro::recursive_generator<QObject*> takeChildRecursivelyImpl( const QObjectList &children, Qt::FindChildOptions opts) { for (QObject *c : children) { if (opts == Qt::FindChildrenRecursively) { co_yield takeChildRecursivelyImpl(c->children(), opts); } co_yield c; } } cppcoro::recursive_generator<QObject*> takeChildRecursively( QObject *root, Qt::FindChildOptions opts = Qt::FindChildrenRecursively) { if (root) { co_yield takeChildRecursivelyImpl(root->children(), opts); } } }
co_yield
рдирд┐рд░реНрджреЗрд╢ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ coroutine рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред
рдЕрдм рдЗрд╕ рдХреЛрдб рдХреЛ children_view
рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░реЗрдВред рдирд┐рдореНрди рдХреЛрдб рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓ рдЧрдП рд╣реИрдВ:
рдХрд░реНрд╕рд░ рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
template <class T> struct children_view<T>::cursor { cppcoro::recursive_generator<QObject*>::iterator it; decltype(auto) read() const { return *it; } void next() { ++it; } auto equal(ranges::default_sentinel_t) const { return it == cppcoro::recursive_generator<QObject*>::iterator(nullptr); } explicit cursor(cppcoro::recursive_generator<QObject*>::iterator it): it(it) {} cursor() = default; };
рдпрд╣рд╛рдБ рдХрд░реНрд╕рд░ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдорд┐рдд рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдмрд╛рдХреА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд▓рд╕реА рдкреЗрдбрд╝ рдХреЗ рдЦрддрд░реЗ рдЪрд▓рддреЗ рд╣реИрдВ
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рдЖрд▓рд╕реА рдЯреНрд░рд╛рд╡реЗрд▓ рд╣рдореЗрд╢рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреЗрдЯред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд▓рд╕реА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
auto children = ranges::to<std::vector>(root | qt::children);
рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ Qt рдореЗрдВ рд╣реЛрдЧрд╛
рд╢рд╛рдпрдж, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ:
- рдЕрдЧрд▓реА рдмрдбрд╝реА рд░рд┐рд▓реАрдЬ, рдХреНрдпреВрдЯреА 6, рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ C ++ 17 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рд╕рдорд░реНрдерди рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдирд╣реАрдВред
- рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
- рдореМрдЬреВрджрд╛ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдард┐рди рд╣реЛрдЧрд╛ред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╡реЗ рдХреНрдпреВрдЯреА 7 рд░рд┐рд▓реАрдЬ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рдХрд╛рд░рдг, рдХреНрд▓реАрдирд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдФрд░ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рд░реЗрдВрдЬ-рд╡реА 3 рдФрд░ рд╕реАрдкреАрдкреА-рдХреЛрд░реЛ) рдХреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ, рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдиреЛрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЖрд▓рд╕реНрдп рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рдЬрдЯрд┐рд▓рддрд╛, рдЬреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
рд╕реНрд░реЛрдд рдХреЛрдб
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрдирдХреЗ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рдореАрд╢рд╛ рд╢реНрд╡реЗрддрдХрд┐рди ( рдЯреНрд░рд┐рд▓рд╛ ) рдХреЛ рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рджред