C ++ QML рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, Qt QML рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ C ++ рдХреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг Qt 5 рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Qt Quick рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо Qt 5.1.0 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди


C ++ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдХрджрдо, рдЗрд╕рдХреЗ рдЧреБрдг, рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде, QML рд╡рд╛рддрд╛рд╡рд░рдг:

рд╡рд┐рд╡рд░рдг Qt рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣реИрдВ, MML C ++ QML рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ, рдФрд░ QML рдХреЗ рд▓рд┐рдП C ++ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдирд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВред

SSH рдХреБрдВрдЬреА рдЬрдирд░реЗрдЯрд░


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ GUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / рдирд┐рдЬреА SSH рдХреБрдВрдЬреА рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ ssh-keygen рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдирдП Qt рдХреНрд╡рд┐рдХ рдХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдерд╛ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХреБрдЫ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо QML рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде qmlscene рдЪрд▓рд╛рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:



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

рд╕реА ++ рд╡рд░реНрдЧ


рдЕрдм, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдиреЗ рд╕реЗ, рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо QML рд╕реЗ рд╕реАрдзреЗ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ C ++ (рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ) рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕реЗ QML рдореЗрдВ рдПрдХ рдирдП KeyGenerator рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдпрд╣ KeyGenerator.h рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

#ifndef KEYGENERATOR_H #define KEYGENERATOR_H #include <QObject> #include <QString> #include <QStringList> // Simple QML object to generate SSH key pairs by calling ssh-keygen. class KeyGenerator : public QObject { Q_OBJECT Q_PROPERTY(QString type READ type WRITE setType NOTIFY typeChanged) Q_PROPERTY(QStringList types READ types NOTIFY typesChanged) Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged) Q_PROPERTY(QString passphrase READ passphrase WRITE setPassphrase NOTIFY passphraseChanged) public: KeyGenerator(); ~KeyGenerator(); QString type(); void setType(const QString &t); QStringList types(); QString filename(); void setFilename(const QString &f); QString passphrase(); void setPassphrase(const QString &p); public slots: void generateKey(); signals: void typeChanged(); void typesChanged(); void filenameChanged(); void passphraseChanged(); void keyGenerated(bool success); private: QString _type; QString _filename; QString _passphrase; QStringList _types; }; #endif 

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

рд╡реИрд╕реЗ, Qt 5.1.0 рдореЗрдВ Q_PROPERTY рдореИрдХреНрд░реЛ рдХреА рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрд░реНрдХ рддрд░реНрдХ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рд╕рджрд╕реНрдп рд╣реИ рдЬреЛ рдЧреЗрдЯ рдФрд░ рд╕реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рд╕реЗрдЯрд┐рдВрдЧ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЗрдирд░реЗрдЯрдХреЗ () рдирд╛рдо рд╕реЗ рдПрдХ рд╕реНрд▓реЙрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред рдпрд╣ рд╕рдм QML рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдо QML рдХреЛ рдирд┐рдпрдорд┐рдд рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ Q_INVOKABLE рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдирд░реЗрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд╕реНрд▓реЙрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдирд┐рдЬреА рд╕рджрд╕реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред

C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм, KeyGenerator.cpp рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ ред рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ:

 #include <QFile> #include <QProcess> #include "KeyGenerator.h" KeyGenerator::KeyGenerator() : _type("rsa"), _types{"dsa", "ecdsa", "rsa", "rsa1"} { } KeyGenerator::~KeyGenerator() { } QString KeyGenerator::type() { return _type; } void KeyGenerator::setType(const QString &t) { // Check for valid type. if (!_types.contains(t)) return; if (t != _type) { _type = t; emit typeChanged(); } } QStringList KeyGenerator::types() { return _types; } QString KeyGenerator::filename() { return _filename; } void KeyGenerator::setFilename(const QString &f) { if (f != _filename) { _filename = f; emit filenameChanged(); } } QString KeyGenerator::passphrase() { return _passphrase; } void KeyGenerator::setPassphrase(const QString &p) { if (p != _passphrase) { _passphrase = p; emit passphraseChanged(); } } void KeyGenerator::generateKey() { // Sanity check on arguments if (_type.isEmpty() or _filename.isEmpty() or (_passphrase.length() > 0 and _passphrase.length() < 5)) { emit keyGenerated(false); return; } // Remove key file if it already exists if (QFile::exists(_filename)) { QFile::remove(_filename); } // Execute ssh-keygen -t type -N passphrase -f keyfileq QProcess *proc = new QProcess; QString prog = "ssh-keygen"; QStringList args{"-t", _type, "-N", _passphrase, "-f", _filename}; proc->start(prog, args); proc->waitForFinished(); emit keyGenerated(proc->exitCode() == 0); delete proc; } 

рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреБрдЫ рдЪрд░, рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, C ++ 11 рд╕реБрд╡рд┐рдзрд╛ _types рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдЪрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬреЛ рдХрд┐ QStringList рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЕрдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрддрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред

рдЯрд╛рдЗрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛рд░реНрдп () рдХреЗрд╡рд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рджрд╕реНрдп рдЪрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдкрдпреБрдХреНрдд рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдирдпрд╛ рдорд╛рди рдкреБрд░рд╛рдиреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ MOC рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рдВрдХреЗрддреЛрдВ рдХреЛ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдХреЗрд╡рд▓ рд╕рд╣реА рд╕рдордп рдкрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЗрд╡рд▓ рдЧреИрд░-рддреБрдЪреНрдЫ рдкрджреНрдзрддрд┐ рдЬреЗрдирд░реЗрдЯрдХреЗ () рд╕реНрд▓реЙрдЯ рд╣реИред рдпрд╣ рдХреБрдЫ рддрд░реНрдХ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░реА ssh-keygen рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП QProcess рдмрдирд╛рддрд╛ рд╣реИред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддреЗрдЬрд╝ рд╣реИ, рд╣рдо рдЗрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ ssh-keygen рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╕рдВрдХреЗрдд рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдмреВрд▓рд┐рдпрди рдХрд╛ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдВрдЬреА рдкреАрдврд╝реА рд╕рдлрд▓ рдереА рдпрд╛ рдирд╣реАрдВред

QML рдХреЛрдб


рдЕрдм main.qml рдореЗрдВ QML рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ :

 // SSH key generator UI import QtQuick 2.1 import QtQuick.Controls 1.0 import QtQuick.Layouts 1.0 import QtQuick.Dialogs 1.0 import com.ics.demo 1.0 ApplicationWindow { title: qsTr("SSH Key Generator") statusBar: StatusBar { RowLayout { Label { id: status } } } width: 369 height: 166 ColumnLayout { x: 10 y: 10 // Key type RowLayout { Label { text: qsTr("Key type:") } ComboBox { id: combobox Layout.fillWidth: true model: keygen.types currentIndex: 2 } } // Filename RowLayout { Label { text: qsTr("Filename:") } TextField { id: filename implicitWidth: 200 onTextChanged: updateStatusBar() } Button { text: qsTr("&Browse...") onClicked: filedialog.visible = true } } // Passphrase RowLayout { Label { text: qsTr("Pass phrase:") } TextField { id: passphrase Layout.fillWidth: true echoMode: TextInput.Password onTextChanged: updateStatusBar() } } // Confirm Passphrase RowLayout { Label { text: qsTr("Confirm pass phrase:") } TextField { id: confirm Layout.fillWidth: true echoMode: TextInput.Password onTextChanged: updateStatusBar() } } // Buttons: Generate, Quit RowLayout { Button { id: generate text: qsTr("&Generate") onClicked: keygen.generateKey() } Button { text: qsTr("&Quit") onClicked: Qt.quit() } } } FileDialog { id: filedialog title: qsTr("Select a file") selectMultiple: false selectFolder: false nameFilters: [ "All files (*)" ] selectedNameFilter: "All files (*)" onAccepted: { filename.text = fileUrl.toString().replace("file://", "") } } KeyGenerator { id: keygen filename: filename.text passphrase: passphrase.text type: combobox.currentText onKeyGenerated: { if (success) { status.text = qsTr('<font color="green">Key generation succeeded.</font>') } else { status.text = qsTr('<font color="red">Key generation failed</font>') } } } function updateStatusBar() { if (passphrase.text != confirm.text) { status.text = qsTr('<font color="red">Pass phrase does not match.</font>') generate.enabled = false } else if (passphrase.text.length > 0 && passphrase.text.length < 5) { status.text = qsTr('<font color="red">Pass phrase too short.</font>') generate.enabled = false } else if (filename.text == "") { status.text = qsTr('<font color="red">Enter a filename.</font>') generate.enabled = false } else { status.text = "" generate.enabled = true } } Component.onCompleted: updateStatusBar() } 

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдп рдЬреАрдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХреЗ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо com.ics.demo рд╕рдВрд╕реНрдХрд░рдг 1.0 рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд▓реНрдж рд╣реА, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдХрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирдпрд╛ QML рдкреНрд░рдХрд╛рд░ KeyGenerator рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА C ++ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рддрдХ рдкрд╣реБрдБрдЪ, QML рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ onKeyGenerated рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреИрд╕реЗ рдХрд┐ qmlscene ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ QML рдЗрдВрдЬрди рдореЗрдВ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЯрд╛рдЗрдк рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 qmlRegisterType<KeyGenerator>("com.ics.demo", 1, 0, "KeyGenerator"); 

рдпрд╣ C ++ рдкреНрд░рдХрд╛рд░ KeyGenerator рдХреЛ QML рдкреНрд░рдХрд╛рд░ KeyGenerator рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбреНрдпреВрд▓ com.ics.demo рд╕рдВрд╕реНрдХрд░рдг 1.0 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рд╕реЗ QML рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЖрдк QGuiApplication рдФрд░ QQuickView рдмрдирд╛рддреЗ рд╣реИрдВ ред рдЕрдм, рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдпрджрд┐ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рддрддреНрд╡ ApplicationWindow рдпрд╛ рд╡рд┐рдВрдбреЛ рд╣реИ ред рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ qmlscene рдХрд╛ рдПрдХ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдоред

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо, main.cpp рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:

 #include <QApplication> #include <QObject> #include <QQmlComponent> #include <QQmlEngine> #include <QQuickWindow> #include <QSurfaceFormat> #include "KeyGenerator.h" // Main wrapper program. // Special handling is needed when using Qt Quick Controls for the top window. // The code here is based on what qmlscene does. int main(int argc, char ** argv) { QApplication app(argc, argv); // Register our component type with QML. qmlRegisterType<KeyGenerator>("com.ics.demo", 1, 0, "KeyGenerator"); int rc = 0; QQmlEngine engine; QQmlComponent *component = new QQmlComponent(&engine); QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); component->loadUrl(QUrl("main.qml")); if (!component->isReady() ) { qWarning("%s", qPrintable(component->errorString())); return -1; } QObject *topLevel = component->create(); QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); QSurfaceFormat surfaceFormat = window->requestedFormat(); window->setFormat(surfaceFormat); window->show(); rc = app.exec(); delete component; return rc; } 


рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ QML рдХреЗ рд╕рд╛рде C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк qmlscene рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ C ++ рдХреЛрдб рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИред

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


рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдирдП QML рдШрдЯрдХ рдмрдирд╛рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЧреБрдг, рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ QML рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, C ++ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдЧреИрд░-рддреБрдЪреНрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ QML рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдк рдпрд╣рд╛рдБ рд╕реЗ рд╕рднреА рдирдореВрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

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


All Articles