GalaPlugin - QtCreator рдХреЗ рд▓рд┐рдП JS / QML рдкреНрд▓рдЧрдЗрди

рдкреНрд▓рдЧрдЗрди рдХреЗ QtCreator + 2 рдореЛрдб рдкреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ QML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ QtCreator рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред GalaPlugin рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ ред

рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдбреЗрдореЛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред



рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, bool initialize(const QStringList &arguments, QString *errorString) рдлрдВрдХреНрд╢рди bool initialize(const QStringList &arguments, QString *errorString) рд╣рдо рдкреНрд▓рдЧрдЗрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ * .gala рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝рдВрдХреНрд╢рди initialize() , рдЬрд┐рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд╡реИрдХрд▓реНрдкрд┐рдХ extensionsInitialized() рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рдВрдЧрдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ (рдЬрдм рд╕рднреА рдкреНрд▓рдЧ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред
  3. рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рдмрд╛рд░реЗ aboutToShutdown() рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ aboutToShutdown() рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ galaPluginOrder , рдЬреЛ рдХрд┐ рдмреВрдЯ рд╕рдордп рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  5. рд╡реИрдХрд▓реНрдкрд┐рдХ рдмреВрд▓рд┐рдпрди рдЪрд░ galaPluginDisable , рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧ рдЗрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  6. рд╡реИрдХрд▓реНрдкрд┐рдХ рдмреВрд▓рд┐рдпрди рдЪрд░ galaPluginTrace , рдЬреЛ рдЖрдкрдХреЛ рд╕рднреА galaPluginTrace рдХреЙрд▓ (рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА) рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг SaveAllBttn.gala рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рдореЛрдб рдмрд╛рд░ рдореЗрдВ рд╕реЗрд╡ рдСрд▓ рдмрдЯрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ
SaveAllBttn.gala
 var galaPluginOrder = 1; var galaPluginTrace = true; function saveAllAction() { var docs = editorManager.documents(); for (var i = 0; i < docs.length; ++i) { var doc = docs[i]; if (doc.isModified()) { doc.save("", false); } } } function createSaveAllButton() { var bttn = galaAPI.createQObject("QPushButton", modeManager); bttn.flat = true; bttn.text = "Save All"; bttn.focusPolicy = 0; bttn.styleSheet = "QPushButton {color: white; }"; // disable button minimum width bttn.sizePolicy = galaAPI.sizePolicy(13, 0, 1); bttn.clicked.connect(saveAllAction); return bttn; } function initialize() { modeManager.addWidget(createSaveAllButton()); galaAPI.debug("Success initialize"); } function extensionsInitialized() { galaAPI.debug("Success extensionsInitialized"); } function aboutToShutdown() { galaAPI.debug("Success aboutToShutdown"); } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 4 рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕реЗ QtCreator API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдУрдВ (рдЬреИрд╕реЗ Core::ICore , Core::Command , Core::ActionManager рдФрд░ рдЕрдиреНрдп) рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░реИрдкрд░ рдмрдирд╛рдПред рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рдЧрднрдЧ рдпрд╛рдВрддреНрд░рд┐рдХ рд╣реИ: рд╣рдо рдПрдХ QObject рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХреНрд▓рд╛рд╕ рд╕реЗ рдЗрд╕рдореЗрдВ QtCreator API рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрд▓реЙрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ рд░реИрдкрд░ рдореЗрдВ рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 class GModeManager : public GWrapper { Q_OBJECT public: GModeManager(QJSEngine* jsEngine) : GWrapper(jsEngine), m_owner(qobject_cast<Core::ModeManager*>(Core::ModeManager::instance())) { Q_ASSERT(m_owner); } ~GModeManager() {} Core::ModeManager* owner1() { return m_owner; } public slots: QJSValue owner() { return m_jsEngine->toScriptValue(m_owner); } QJSValue currentMode() { return m_jsEngine->toScriptValue(m_owner->currentMode()); } QJSValue mode(QString id) { return m_jsEngine->toScriptValue(m_owner->mode(str2id(id))); } void addAction(QAction *action, int priority) { m_owner->addAction(action, priority); } void addProjectSelector(QAction *action) { m_owner->addProjectSelector(action); } void addWidget(QWidget *widget) { m_owner->addWidget(widget); } void activateMode(QString id) { m_owner->activateMode(str2id(id)); } void setFocusToCurrentMode() { m_owner->setFocusToCurrentMode(); } bool isModeSelectorVisible() { return m_owner->isModeSelectorVisible(); } void setModeSelectorVisible(bool visible) { m_owner->setModeSelectorVisible(visible); } private: Core::ModeManager* m_owner; }; 


рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рддреА рд╣реИ: рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрд░реЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдБ editorManager.documents() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 QJSValue documents() { QList<Core::IDocument *> documents = m_owner->documentModel()->openedDocuments(); QJSValue array = m_jsEngine->newArray(documents.size()); for (quint32 i = 0; i < (quint32)documents.size(); ++i) { array.setProperty(i, m_jsEngine->newQObject(new GDocument(m_jsEngine, documents[i]))); } return array; } 


рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / QML рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдХреЛрд░ - Core::ICore::instance() рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ Core::ICore::instance()
  2. messageManager - Core::MessageManager::instance() рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ Core::MessageManager::instance()
  3. ActionManager - Core::ActionManager::instance() рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ Core::ActionManager::instance()
  4. EditorManager - Core::EditorManager:instance() рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ Core::EditorManager:instance()
  5. ModeManager - Core::ModeManager::instance() рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ Core::ModeManager::instance()
  6. galaAPI - рд╕рд╣рд╛рдпрдХ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣реБрдБрдЪ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

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

 GCommand *command(QString id) { return new GCommand(m_jsEngine, m_owner->command(str2id(id))); } 

рдпрджрд┐ рд╕реНрд▓реЙрдЯ рдЖрдВрддрд░рд┐рдХ QtCreator рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ, рддреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЗрд╕рдХрд╛ рдорд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реВрдЪрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ QJSValue рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реВрдЪрдХ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реИред

 //  QMenu* QJSValue menu() const { return m_jsEngine->toScriptValue(static_cast<QObject*>(m_owner->menu())); } 


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

рдЬрдм рдЬреЗрдПрд╕ рд╕реЗ рдХреБрдЫ рд╡рд┐рдзрд┐ foo рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд╡рд╕реНрддреБ рдХреЗ рдореЗрдЯрд╛-рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рдХрд╛рд░) рдореЗрдВ рдХреЛрдИ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрджрд┐ рд╕рдВрдХреЗрдд рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ moc рдХрдИ рдореЗрдЯрд╛-рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдХреЗрдд void foo(int a, int b = 0, int c = 1); рддреАрди рдореЗрдЯрд╛ рддрд░реАрдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ
 void foo(int a); void foo(int a, int b); void foo(int a, int b, int c); 

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

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


рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЖрдкрдХреЛ QtCreator'a рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдореЛрдб рдкреИрдирд▓ рдкрд░ рджреГрд╢реНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧ-рдЗрди рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЯреВрд▓рдмрд╛рд░ рдФрд░ рдореЗрдиреВ рдЖрдЗрдЯрдо рдмрдирд╛рддрд╛ рд╣реВрдВред рдХреНрдпреВрдПрдордПрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдорд╣рд╛рди рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ QML рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛, рдЪрд╛рд╣реЗ рд╡рд╣ рдореМрд╕рдо рд╣реЛ, рд╡рд┐рдирд┐рдордп рджрд░ рд╣реЛ, рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдирдП рд▓реЗрдЦ рд╣реЛрдВ, рдЦреЗрд▓ рдореЗрдВ рдЦрд╛рддреЗ рд╣реЛрдВ, рдирд┐рд░реНрдорд╛рдг рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛ рдЖрджрд┐ред рдореИрдВ рдХреНрдпреВрдПрдордПрд▓ рдкреЗрд╢реЗрд╡рд░ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдиреЗрдЯ рдкрд░ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ рдпрд╛, рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдЖрдкрдиреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдореБрдЭреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

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

рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдПрд╕, рдПрдХ рдФрд░ рд╡реАрдбрд┐рдпреЛ:

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


All Articles