
рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ QML рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реИ, рдФрд░ рдЖрдЬ рд╣рдо API рдореЙрдбреНрдпреВрд▓
QtLocation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЕрднреНрдпрд╛рд╡реЗрджрди
Qt рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡реНрдпреВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдЦ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреГрд╢реНрдп рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░
QtLocation рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдирдХреНрд╢реЗ рдХреА рдЬрдбрд╝рддрд╛ рдЖрдВрджреЛрд▓рди, рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрдЯреЗрдб рд╕рдВрдХреНрд░рдордг,
рдЬреАрдкреАрдПрд╕ рд╕реНрдерд╛рди, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрддреНрд╡ рдФрд░ рдкрд╛рда рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ред
рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рд╕реЗ
рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВ
, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
- рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреЗрдЦреЗрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
- рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп
- QtLocation рдореЙрдбреНрдпреВрд▓
- рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╕реЗрд╡рд╛рдПрдБ
- GPS рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
- рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ
- рдирд┐рд╖реНрдХрд░реНрд╖
- рд╕рдВрджрд░реНрдн
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреЗрдЦреЗрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдЧреНрд░рд╛рдлрд┐рдХ рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ
рдореЙрдбрд▓ / рджреГрд╢реНрдп рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ
QGraphicsScene рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛
QGraphicsView рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдПрдХ рд╣реА рджреГрд╢реНрдп рдХреЛ рд╡рд┐рднрд┐рдиреНрди рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧреНрд░рд╛рдлрд┐рдХ рджреГрд╢реНрдп рдореЗрдВ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ - рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ
QGraphicsItem рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд╕реНрддреБрдПрдВред
рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рдЧрддрд┐ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХ рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЫреЛрдЯрд╛, рдШреБрдорд╛рдпрд╛ рдФрд░ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдЯ-рдЗрди Qt рдЗрдВрдЬрди рдФрд░ OpenGL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдПрдиреАрдореЗрд╢рди рдФрд░ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЧреНрд░рд╛рдлрд┐рдХ рджреГрд╢реНрдп рдЗрдХрд╛рдЗрдпреЛрдВ рд╕реЗ рд╣рдЬрд╛рд░реЛрдВ рддрддреНрд╡реЛрдВ рдХреЗ рджрд╕рд┐рдпреЛрдВ рддрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рдЪрд┐рддреНрд░рдг
40,000 рдЪрд┐рдкреНрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред
QWidget рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдЬреЗрдЯ рдХреЛ рднреА рдордВрдЪ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯ рдХреЛ
QGraphicsProxyWidget рд╡рд░реНрдЧ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдордВрдЪ рдкрд░ рдкреНрд░реЙрдХреНрд╕реА рд╡рд┐рдЬреЗрдЯ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░реЙрдХреНрд╕реА рд╡рд┐рдЬреЗрдЯ (рдпрд╛
QWidget рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВ) рдзреАрдореЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдордВрджреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧреА, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
QtLabs [En] рджреЗрдЦреЗрдВ)ред
рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп
QGraphicsItem рд╡рд░реНрдЧ рд╕рднреА рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рджреЛ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:
рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рд░реЗрдХреНрдЯ () рдФрд░
рдкреЗрдВрдЯ () ред
рдкреЗрдВрдЯ () рд╡рд┐рдзрд┐
QWidget :: paintEvent () рд╡рд┐рдзрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмрд╛рдЙрдВрдбрд┐рдВрдЧрд░реЗрдХреНрдЯ () рд╡рд┐рдзрд┐ рддрддреНрд╡ рдХреЗ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреА рд╣реИ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрдХрд░рд╛рд╡реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рд╡рд░реНрдЧ рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рдЗрд╡реЗрдВрдЯ, рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк, рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рджреГрд╢реНрдп рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рддрдмреНрджреАрд▓ рдХрд░рддрд╛ рд╣реИ, рджреГрд╢реНрдп рдХреЗ
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдШрдЯрдирд╛ рд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рдХреЛ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
QtLocation рдореЙрдбреНрдпреВрд▓



QtLocation рдореЙрдбреНрдпреВрд▓ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реНрдерд┐рддрд┐ рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рд╕реВрдЪрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рд╕реЗ рд╕рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЙрдкрдЧреНрд░рд╣реЛрдВ рдпрд╛ рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИред
QtLocation рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ
QGeoPositionInfoSource рдЬреИрд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (GPS) рдпрд╛ рдЕрдиреНрдп рд╕реНрдерд╛рди рд╕реНрд░реЛрддреЛрдВ, рдФрд░
QGeoSatelicInfoSource рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдЧреНрд░рд╣ рдкреЛрдЬреАрд╢рдирд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдИ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдерд╛рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
QGeoCoordinate , рдЬрд┐рд╕рдореЗрдВ рдЕрдХреНрд╖рд╛рдВрд╢, рджреЗрд╢рд╛рдВрддрд░ рдФрд░ рдКрдВрдЪрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИред
QGeoBoundingBox рдФрд░
QGeoBoundingCircle рдХреЗ рд░реВрдк рдореЗрдВ
QtLocation рднреМрдЧреЛрд▓рд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рддреЛ рдПрдХ рдЕрдореВрд░реНрдд рд░реВрдк рдореЗрдВ, рдЬреИрд╕реЗ
QGeoBoundingArea рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХред
рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╕реЗрд╡рд╛рдПрдБ

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдирдХреНрд╢реЗ, рджреГрд╢реНрдпреЛрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рднреМрдЧреЛрд▓рд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕реНрд░реЛрдд рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛
QGeoServiceProvider рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдирд╛ рд╣реИ ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди-рд╕реА рд╕реЗрд╡рд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЖрдк
QGeoServiceProvider :: availableServiceProviders () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрджрд┐ рдХреЛрдИ рд╕реЗрд╡рд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдПрдХ рдЦрд╛рд▓реА
QStringList рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:
QStringList services = QGeoServiceProvider::availableServiceProviders(); if (services.isEmpty()) { // }
рдПрдХ рдмрд╛рд░ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо
QGeoMappingManager рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
QGeoMappingManager *manager = service.mappingManager();
рдорд╛рдирдЪрд┐рддреНрд░ рдпрд╛ рд░реВрдЯрд┐рдВрдЧ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
searchManager () рдпрд╛
routingManager () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
QtLocation рд╣рдореЗрдВ
QGeoMappingManager рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
QGraphicsGeoMap рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдФрд░ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдирд╛ рд╣реИ, рдФрд░ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реИ:
QGraphicsScene scene; QGraphicsView view; view.setScene(&scene); QGraphicsGeoMap *geoMap = new QGraphicsGeoMap(manager); scene.addItem(geoMap);
GPS рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

GPS рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
QGeoPositionInfoSource рдХреЙрд▓
рдХрд░рдХреЗ QGeoPositionInfoSource рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
:: createDefaultSource () , рдЬреЛ рдЖрдкрдХреЛ
QGeoPositionInfo рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди
рдХрд░рддрд╛ рд╣реИ ред рдЬрд┐рди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реНрдерд╛рди рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡реЗ
рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
() рд╕рд┐рдЧреНрдирд▓ рддрд╛рдХрд┐
QGeoPositionInfoSource startUpdates () рдпрд╛
requestUpdate () рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░
рджреЗ ред
рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╕реНрдерд╛рди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = 0) : QObject(parent) { QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this); if (source) { connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo))); source->startUpdates(); } } private slots: void positionUpdated(const QGeoPositionInfo &info) { qDebug() << "Position updated:" << info; } };
рдпрджрд┐ рдирд┐рдпрдорд┐рдд рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ,
рддреЛ рдЗрди рдЕрдкрдбреЗрдЯ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
setUpdateInterval () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдВрддрд░рд╛рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдЕрдкрдбреЗрдЯ рдЖрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╣рд░ 30 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
// Emit updates every 30 seconds if available QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(someParent); if (source) source->setUpdateInterval(30000);
рдПрдХ рджрд┐рдП рдЧрдП рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрдЯреЗрдб рд╕рдВрдХреНрд░рдордг
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдм рд╣рдо рдХреЛрдб рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдЪрд┐рдХрдиреА рдорд╛рдирдЪрд┐рддреНрд░ рдЖрдВрджреЛрд▓рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
QGraphicsGeoMap рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
class GeoMap : public QGraphicsGeoMap { Q_OBJECT Q_PROPERTY(double centerLatitude READ centerLatitude WRITE setCenterLatitude) Q_PROPERTY(double centerLongitude READ centerLongitude WRITE setCenterLongitude) public: GeoMap(QGeoMappingManager *manager, QGraphicsItem *parent = 0); void animatedPanTo(const QGeoCoordinate& center); double centerLatitude() const { return center().latitude(); } void setCenterLatitude(double lat); double centerLongitude() const { return center().longitude(); } void setCenterLongitude(double lon);
рдФрд░ рдЖрд╡реЗрджрди:
void GeoMap::animatedPanTo(const QtMobility::QGeoCoordinate ┬вer) { QGeoCoordinate curStart(this->center()); if (curStart == center) return; // setStatusBarText(QString("Panning to %1").arg(center.toString(QGeoCoordinate::Degrees))); QPropertyAnimation *latAnim = new QPropertyAnimation(this, "centerLatitude"); latAnim->setEndValue(center.latitude()); latAnim->setDuration(300); QPropertyAnimation *lonAnim = new QPropertyAnimation(this, "centerLongitude"); lonAnim->setEndValue(center.longitude()); lonAnim->setDuration(300); QParallelAnimationGroup *group = new QParallelAnimationGroup; group->addAnimation(latAnim); group->addAnimation(lonAnim); group->start(QAbstractAnimation::DeleteWhenStopped); } void GeoMap::setCenterLatitude(double lat) { QGeoCoordinate c = center(); c.setLatitude(lat); setCenter( c); } void GeoMap::setCenterLongitude(double lon) { QGeoCoordinate c = center(); c.setLongitude(lon); setCenter( c); }
рдЕрдм, рдЬрдм
AnimPanTo () рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
, рддреЛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордиреНрд╡рдп рдкрд░ рдФрд░ рдЗрдЪреНрдЫрд┐рдд рдХреЛрдг рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддреНред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдХреЗрдВрджреНрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдирдпрд╛ рд╕рдордиреНрд╡рдп рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдирдХреНрд╢рд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛ред рдЪреВрдВрдХрд┐
QPropertyAnimation рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ QGeoCoordinate рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рджреЛ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдПрдиреАрдореЗрд╢рди (рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ
рдХреА рд╕реВрдЪреА ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдк рдЕрдкрдиреЗ
рдЗрдВрдЯрд░рдкреЛрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рдереЗ рдФрд░
QGeoCoordinate рдХреЛ
QVariant рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ
рдереЗ , рд▓реЗрдХрд┐рди рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред
рдЪреБрдЯрдХреА рдХрд╛ рдЗрд╢рд╛рд░рд╛

Qt рдореЗрдВ рдПрдХ рдЬреЗрд╕реНрдЪрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
рдлреНрд░реЗрдорд╡рд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдХрд┐ рдЗрдирдкреБрдЯ рдкрджреНрдзрддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдиреНрд╣реЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЗрд╢рд╛рд░рд╛ рдПрдХ рдорд╛рдЙрд╕ рдЖрдВрджреЛрд▓рди, рдЯрдЪ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕реНрдкрд░реНрд╢ рдпрд╛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред Qt рдореЗрдВ, рдЬреЗрд╕реНрдЪрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
QPanGesture ,
QPinchGesture, рдФрд░
QSwipeGesture ред рд╕рд▓реАрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдЬреЗрд╕реНрдЪрд░ рдХреЛ
рдЧреНрд░реИрдЧреНрдпреЛрд░рдЪрд░ (Qt :: PinchGesture) рд╡рд┐рдзрд┐ рдХрд╣рдХрд░ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ
рджреГрд╢реНрдп () рдореЗрдВ
рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ:
bool GeoMap::sceneEvent(QEvent *event) { switch (event->type()) { case QEvent::Gesture: { if (QGestureEvent *gesture = static_cast<QGestureEvent *>(event)) { if (QPinchGesture *pinch = static_cast<QPinchGesture *>(gesture->gesture(Qt::PinchGesture))) { qreal scale = qLn(pinch->scaleFactor())/qLn(2); qreal zoom = 0; zoom = scale > 0 ? 1 : -1; setZoomLevel(zoomLevel() + zoom); return true; } } } default: break; } return QGraphicsGeoMap::sceneEvent(event); }
рдХреНрдпреВрдЯреА рдЖрдкрдХреЛ
рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╕реНрдХреНрд░реАрди рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ
рдЫреВрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
Qt :: WA_AcceptTouchEvents рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП,
acceptTouchEvents (рд╕рдЪ) рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рдХрд╛рдЗрдиреЗрдЯрд┐рдХ рд╕реНрдХреНрд░реЙрд▓
рдХрд╛рдЗрдиреЗрдЯрд┐рдХ рд╕реНрдХреНрд░реЙрд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдПрдХ рдЬрдбрд╝рддреНрд╡реАрдп рдЖрдВрджреЛрд▓рди рд╣реИ, рди рдЬрд╛рдиреЗ рдХреИрд╕реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рджреЗрдЦрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реМ рдмрд╛рд░ рдкрдврд╝реЗрдВред рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреЛ рд╣рдорд╛рд░реЗ рдмрд╛рдХреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓:
protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void wheelEvent(QGraphicsSceneWheelEvent *event); void keyPressEvent(QKeyEvent * event); void keyReleaseEvent(QKeyEvent * event); bool sceneEvent(QEvent *event); private slots: void kineticTimerEvent(); private: void panFloatWrapper(const QPointF & delta); void applyPan(const Qt::KeyboardModifiers & modifiers); void setStatusBarText(const QString &text); private: bool panActive; bool panDecellerate;
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкрд╣рд▓реЗ рд╣рдо рдЖрдВрджреЛрд▓рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
//////////////////////////////////////////////////////////////////////////////// // TODO: Some of these could be exposed in a GUI and should probably be put elsewhere in that case // (and made non-const) // Kinect annimation properties static const bool enableKineticPanning = true; // time until kinetic panning speed slows down to 50%, in msec static const qreal kineticPanningHalflife = 160.0; // keyboard panning speed without modifiers, in pixels/msec static const qreal panSpeedNormal = 0.3; // keyboard panning speed with shift, in pixels/msec static const qreal panSpeedFast = 1.0; // minimum panning speed, in pixels/msec static const qreal kineticPanSpeedThreshold = 0.005; // temporal resolution. Smaller values take more CPU but improve visual quality static const int kineticPanningResolution = 20; // maximum time between last mouse move and mouse release for kinetic panning to kick in static const int holdTimeThreshold = 100; ////////////////////////////////////////////////////////////////////////////////
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдХреА:
void GeoMap::mousePressEvent(QGraphicsSceneMouseEvent *event) { setFocus(); if (event->button() == Qt::LeftButton) { panActive = true; // When pressing, stop the timer and stop all current kinetic panning kineticTimer.stop(); kineticPanSpeed = QPointF(); lastMoveTime = QTime::currentTime(); } event->accept(); } void GeoMap::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (panActive) { setCursor(Qt::ClosedHandCursor); // Calculate time delta QTime currentTime = QTime::currentTime(); int deltaTime = lastMoveTime.msecsTo(currentTime); lastMoveTime = currentTime; // Calculate position delta QPointF delta = event->lastPos() - event->pos(); // Calculate and set speed if (deltaTime > 0) { kineticPanSpeed = delta / deltaTime; mouseHistory.push_back(MouseHistoryEntry(kineticPanSpeed, currentTime)); mouseHistory.pop_front(); } // Pan map panFloatWrapper(delta); } event->accept(); } void GeoMap::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) { if (event->button() == Qt::LeftButton && panActive) { panActive = false; setCursor(Qt::OpenHandCursor); if (!enableKineticPanning || lastMoveTime.msecsTo(QTime::currentTime()) > holdTimeThreshold) { return; } kineticPanSpeed = QPointF(); int entries_considered = 0; QTime currentTime = QTime::currentTime(); foreach(MouseHistoryEntry entry, mouseHistory) { // first=speed, second=time int deltaTime = entry.second.msecsTo(currentTime); if (deltaTime < holdTimeThreshold) { kineticPanSpeed += entry.first; entries_considered++; } } if (entries_considered > 0) kineticPanSpeed /= entries_considered; lastMoveTime = currentTime; // When releasing the mouse button/finger while moving, // start the kinetic panning timer kineticTimer.start(); panDecellerate = true; } event->accept(); } void GeoMap::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event) { setFocus(); animatedPanTo(screenPositionToCoordinate(event->pos())); event->accept(); } // ... void GeoMap::kineticTimerEvent() { QTime currentTime = QTime::currentTime(); int deltaTime = lastMoveTime.msecsTo(currentTime); lastMoveTime = currentTime; if (panDecellerate) kineticPanSpeed *= qPow(qreal(0.5), qreal(deltaTime / kineticPanningHalflife)); QPointF scaledSpeed = kineticPanSpeed * deltaTime; if (kineticPanSpeed.manhattanLength() < kineticPanSpeedThreshold) { // Kinetic panning is almost halted -> stop it. kineticTimer.stop(); return; } panFloatWrapper(scaledSpeed); } // Wraps the pan(int, int) method to achieve floating point accuracy, // which is needed to scroll smoothly. void GeoMap::panFloatWrapper(const QPointF & delta) { // Add to previously stored panning distance remainingPan += delta; // Convert to integers QPoint move = remainingPan.toPoint(); // Commit mouse movement pan(move.x(), move.y()); // Store committed mouse movement remainingPan -= move; }
рдореИрдВрдиреЗ рдХреАрдмреЛрд░реНрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдЖрдк рдкреВрд░реА
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдбрд╝рддрд╛ рдЖрдВрджреЛрд▓рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕реНрдЯреЗрдЯрд╕ рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо

рдЕрдм рдЪрд▓реЛ рд╕реНрдЯреЗрдЯрд╕ рд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдХреНрд╕реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рддрддреНрд╡ рдкрд╣рд▓реЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рд╕реЗ рд╡рд┐рд▓рдВрдм рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЫрд┐рдкрддрд╛ рд╣реИред рддреЛ, рдЪрд▓реЛ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
// An animated status bar item that appears at the bottom // of the map class StatusBarItem : public QObject, public QGraphicsRectItem { Q_OBJECT Q_PROPERTY(int offset READ offset WRITE setOffset) public: explicit StatusBarItem(); ~StatusBarItem(); int offset() const; void setRect(qreal x, qreal y, qreal w, qreal h); public slots: void setText(QString text); void showText(QString text, quint32 timeout=3000); void show(); void hide(); void setOffset(int offset); private: int m_offset; QGraphicsSimpleTextItem *m_textItem; };
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдПрдХ рдЖрдпрдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ
QGraphicsSimpleTextItem рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:
StatusBarItem::StatusBarItem() { m_offset = 0; setPen(QPen(QBrush(), 0)); setBrush(QBrush(QColor(0,0,0,120))); m_textItem = new QGraphicsSimpleTextItem(this); m_textItem->setBrush(QBrush(Qt::white)); setText(""); } StatusBarItem::~StatusBarItem() { } void StatusBarItem::setText(QString text) { m_textItem->setText(text); QRectF rect = m_textItem->boundingRect(); QPointF delta = this->rect().center() - rect.center(); m_textItem->setPos(delta.x(), delta.y()); } int StatusBarItem::offset() const { return m_offset; } void StatusBarItem::setRect(qreal x, qreal y, qreal w, qreal h) { QGraphicsRectItem::setRect(x, y + m_offset, w, h); QFont f; f.setFixedPitch(true); f.setPixelSize(h/1.1); m_textItem->setFont(f); setText(m_textItem->text()); } void StatusBarItem::setOffset(int offset) { this->setY(this->y() - m_offset + offset); m_offset = offset; } void StatusBarItem::showText(QString text, quint32 timeout) { setText(text); show(); QTimer::singleShot(timeout, this, SLOT(hide())); } void StatusBarItem::show() { QPropertyAnimation *anim = new QPropertyAnimation(this, "offset"); anim->setStartValue(0); anim->setEndValue(-1 * rect().height()); anim->setDuration(500); anim->start(QAbstractAnimation::DeleteWhenStopped); } void StatusBarItem::hide() { QPropertyAnimation *anim = new QPropertyAnimation(this, "offset"); anim->setStartValue(m_offset); anim->setEndValue(0); anim->setDuration(500); anim->start(QAbstractAnimation::DeleteWhenStopped); }
рдПрдиреАрдореЗрд╢рди рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░, рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рддрддреНрд╡ рдХреЛ рдпрд╛ рддреЛ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдЦреАрдВрдЪрддрд╛ рд╣реИред Qt
рдХрд╛ рдЖрджрд░реНрд╢ рд╡рд╛рдХреНрдп
"рдХреЛрдб рдХрдо рд╣реИред рдЕрдзрд┐рдХ рдмрдирд╛рдПрдБред тАЭ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд╛рд▓реВ рд╣реИред
рд╕реНрдХреЗрд▓ рддрддреНрд╡

рдпрд╣рд╛рдВ рдореИрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдЯрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░реА рд╕рдордп рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджрд┐рдпрд╛ (рдкрд░рд┐рдгрд╛рдореА рд▓реЗрдЦ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рджреЗрдЦрдХрд░) рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рддреЛ, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд
QGraphicsRectItem рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рдФрд░ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд▓рд┐рдП
+ рдФрд░
- , рдФрд░
QGraphicsLineItem рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ
рдкрд╛рда рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рддрддреНрд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рдФрд░ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░, рдпрд╣ рдпрд╛ рддреЛ рдирдХреНрд╢реЗ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдпрд╛ рдШрдЯрд╛рддрд╛ рд╣реИ:
// // , 0 m_geoMap->setZoomLevel(m_geoMap->zoomLevel() + zoomLevel(event->pos()));
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рддрддреНрд╡ рдХреЛ
QGraphicsItem рд╕реЗ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╕ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЦреАрдВрдЪрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдерд╛ред рдЬреЛ рдХреЛрдИ рднреА рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдХрдо рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ
QGraphicsView рдХреЛ рд░реЗрдВрдбрд░
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenGL
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕
QGLWidget рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ
рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
#ifndef QT_NO_OPENGL setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)))
рдФрд░
QGraphicsView рдХреЗ рд▓рд┐рдП
рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐
QGLWidget рдЖрдВрд╢рд┐рдХ рд╕реНрдХреНрд░реАрди рдЕрдкрдбреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреГрд╢реНрдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдирд┐рдореЗрдЯреЗрдб рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рддрддреНрд╡ рд╣реИрдВ, рддреЛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдк рддрддреНрд╡ рдЕрдиреБрдХреНрд░рдордг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
graphicsScene->setItemIndexMethod(QGraphicsScene::NoIndex)
рд╕реНрдерд┐рд░ рджреГрд╢реНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП
рдЕрдиреБрдХреНрд░рдордг рдорд╣рд╛рди рд╣реИ; рдпрд╣
рдЖрдЗрдЯрдо () рдФрд░
рдЖрдЗрдЯрдордПрдЯ () рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рджреГрд╢реНрдп рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЖрдк
QGraphicsView рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдХреЗ
рдЕрдиреБрдХреВрд▓рди рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдмрдбрд╝рд╛ рдирд┐рдХрд▓рд╛, рдФрд░ рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рд╡рд╕реНрддреБрдУрдВ
рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛,
рдПрдХ рдорд╛рд░реНрдЧ рдмрд┐рдЫрд╛рдпрд╛, рдФрд░
рд▓реИрдВрдбрдорд╛рд░реНрдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ (рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг
1 рдФрд░
2 рджреЗрдЦреЗрдВ )ред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ, рд╣рдо
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡реНрдпреВ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП,
QtLocation API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЦреНрдп рдмрд┐рдВрджреБ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ,
рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦрд╛ рдФрд░ рдирдХреНрд╢реЗ рдХреЗ рдЬрдбрд╝рддреНрд╡реАрдп рдЖрдВрджреЛрд▓рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд╛рдВрдЪ рдХреА, рдирдХреНрд╢реЗ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрддреНрд╡ рдФрд░ рдкрд╛рда рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдШрдЯрдХ рдмрди рдЧрдпрд╛, рдЬрд┐рд╕реЗ рдПрдХ рдкреВрд░реНрдг рдирд╛рд╡рд┐рдХ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
Qt SDK рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ Qt рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХред
рд╕рдВрджрд░реНрдн
- рдХреНрдпреВрдЯреА рд╡реАрдбрд┐рдпреЛ
- рд╕реАрди рдЧреНрд░рд╛рдлрд╝: рдХреНрдпреВрдЯреА рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг
- рдкреНрд░рджрд░реНрд╢рди: рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ
- Qt GraphicsView рдЧрд╣рд░рд╛рдИ рдореЗрдВ
- рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА - рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡реНрдпреВ
- рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛
рд▓реЗрдЦ рдкрд░ PS рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдпрд╣ рдореЗрд░реЗ рдЬреИрд╕реЗ рдЕрдиреБрднрд╡рд╣реАрди рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рджред