рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб

рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!

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


рд╣рдо рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗ?


рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо QNetworkAccessManager рдФрд░ QEventLoop , рд╕рд╛рде рд╣реА рдХреБрдЫ рдореЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╕рдорд░реНрдерд┐рдд Qt рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рдЦреИрд░, рд╣рдо рдЕрднреА рднреА рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗ?


рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рд╛рди QGraphicsEffect рд╡рд░реНрдЧ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рдордВрдЬрд╕реНрдп! рдФрд░ рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Qt 4.8.0 рдореЗрдВ, рдпреЗ рдкреНрд░рднрд╛рд╡ Mac OS X 10.7ред + рдореЗрдВ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд░реИрд╢ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ, рдФрд░ Qt 4.7.4 рдореЗрдВ рдЙрд╕реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЬреЛ рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреНрдпреВрдЯреА рдмрдЧ рдЯреНрд░реИрдХрд░ рдореЗрдВ рдПрдХ рдмрдЧ рд╕реЗрдЯ рдХрд┐рдпрд╛ ред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗред рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХреЗрдЧрд╛:

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

рддреЛ рдЫрд╡рд┐ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдЪрд┐рддреНрд░ рдХрд╛ URL рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЛ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдФрд░ рдХрд┐рд╕ рдкрджреНрдзрддрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВред рдФрд░ рдЬрдм рдЫрд╡рд┐ рд▓реЛрдб рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХрд╛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рд╕рдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ?

рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП! рд╣рдо Networking рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ), рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП NetworkingPrivate рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ -ред

 // networking.h class Networking { public: static QImage httpGetImage(const QUrl& src); static void httpGetImageAsync(const QUrl& src, QObject * receiver, const char * slot); private: static NetworkingPrivate * networkingPrivate; static void init(); } // networking_p.h class NetworkingPrivate : public QObject { Q_OBJECT public: NetworkingPrivate(); ~NetworkingPrivate(); QImage httpGetImage(const QUrl& src) const; void httpGetImageAsync(const QUrl& src, QObject * receiver, const char * slot); public slots: void onFinished(QNetworkReply* reply); private: QNetworkAccessManager * nam; QEventLoop * loop; QMap<QNetworkReply*, QPair<QObject*, QPair<QUrl, const char *> > > requests; }; 

рджрд░рдЕрд╕рд▓, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рд╕рдордХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреАред рддреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 // myclass.h class MyClass: public QObject { // ... public slots: void loadImage(const QString & urlString); void onImageReady(const QUrl& url, const QImage & image); } // myclass.cpp void MyClass::loadImage(const QString & urlString) { Networking::httpGetImageAsync(QUrl(urlString), this, "onImageRead"); } 

рдмреАрдорд╛ рдпреЛрдЧреНрдп рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рд╣рдореЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QNetworkAccessManager рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, QEventLoop , рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрд╣ рдбрд░рд╛рд╡рдирд╛ QMap<QNetworkReply*, QPair<QObject*, QPair<QUrl, const char *> > > requests - рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╛рдирд┐рдП рдХрд┐рд╕ рдЪрд┐рддреНрд░ рдХреЛ рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбрд┐рд▓реАрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдЬреА рд╡рд░реНрдЧ ( Networking рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдирд┐рдЬреА рд╡рд░реНрдЧ рдХреЛ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

 NetworkingPrivate::NetworkingPrivate() { nam = new QNetworkAccessManager(); loop = new QEventLoop(); connect(nam, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit())); connect(nam, SIGNAL(finished(QNetworkReply*)), SLOT(onFinished(QNetworkReply*))); } NetworkingPrivate::~NetworkingPrivate() { nam->deleteLater(); loop->deleteLater(); } QImage NetworkingPrivate::httpGetImage(const QUrl& src) const { QNetworkRequest request; request.setUrl(src); QNetworkReply * reply = nam->get(request); loop->exec(); QVariant redirectedUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QUrl redirectedTo = redirectedUrl.toUrl(); if (redirectedTo.isValid()) { // guard from infinite redirect loop if (redirectedTo != reply->request().url()) { return httpGetImage(redirectedTo); } else { qWarning() << "[NetworkingPrivate] Infinite redirect loop at " + redirectedTo.toString(); return QImage(); } } else { QImage img; QImageReader reader(reply); if (reply->error() == QNetworkReply::NoError) reader.read(&img); else qWarning() << QString("[NetworkingPrivate] Reply error: %1").arg(reply->error()); reply->deleteLater(); return img; } } void NetworkingPrivate::httpGetImageAsync(const QUrl& src, QObject * receiver, const char * slot) { QNetworkRequest request; request.setUrl(src); QPair<QObject*, QPair<QUrl, const char *> > obj; obj.first = receiver; obj.second.first = src; obj.second.second = slot; QNetworkReply * reply = nam->get(request); requests.insert(reply, obj); } void NetworkingPrivate::onFinished(QNetworkReply* reply) { if (requests.contains(reply)) { QPair<QObject*, QPair<QUrl, const char *> > obj = requests.value(reply); QVariant redirectedUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QUrl redirectedTo = redirectedUrl.toUrl(); if (redirectedTo.isValid()) { // guard from infinite redirect loop if (redirectedTo != reply->request().url()) { httpGetImageAsync(redirectedTo, obj.first, obj.second.second); } else { qWarning() << "[NetworkingPrivate] Infinite redirect loop at " + redirectedTo.toString(); } } else { QImage img; QImageReader reader(reply); if (reply->error() == QNetworkReply::NoError) reader.read(&img); else qWarning() << QString("[NetworkingPrivate] Reply error: %1").arg(reply->error()); if (obj.first && obj.second.second) QMetaObject::invokeMethod(obj.first, obj.second.second, Qt::DirectConnection, Q_ARG(QUrl, obj.second.first), Q_ARG(QImage, img)); } requests.remove(reply); reply->deleteLater(); } } 

рдЕрдм рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рдПрдХ QEventLoop , QNetworkAccessManager рдФрд░ QEventLoop::quit() рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ QEventLoop::quit() рдФрд░ рд╣рдорд╛рд░реА onFinished рд╡рд┐рдзрд┐ред

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

рдЦреИрд░, рдЬрдм рд╣рдореЗрдВ рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдорд┐рд▓реА, рддреЛ QImageReader рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрддрд┐рдо QImage рдореЗрдВ рдкрдврд╝реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдкреЗрдЪреАрджрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдбрд░рд╛рд╡рдиреЗ QMap рдореЗрдВ рдЕрдиреБрд░реЛрдз (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдВрдХ), рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЛ QMap рдФрд░ рдлрд┐рд░ рдЕрдиреБрд░реЛрдз рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рдордХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз (рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рдЗрд╕рдХреА рдЪрдХреНрд░реАрдпрддрд╛ рдФрд░ рдЪрд┐рддреНрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ) рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рд╛рдкреНрдд QImage рдХреЛ QMetaObject::invokeMethod рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдХреНрд╖реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ - URL рдФрд░ рдЪрд┐рддреНрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред

рдареАрдХ рд╣реИ, рдЖрдк рдПрдХ рд╕рд░рд▓ рд░реВрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк URL рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗред рдФрд░ рдЖрдирдиреНрдж рдордирд╛рдУред

рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреАред

рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛


рд╣рдо рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдкрд╛рд╕ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ), рдЪрд▓реЛ рдЗрд╕реЗ ImageManager рдХрд╣рддреЗ рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ:

 class ImageManager { public: static QImage normallyResized(const QImage & image, int maximumSideSize); static QImage grayscaled(const QImage & image); static QImage squared(const QImage & image, int size); static QImage roundSquared(const QImage & image, int size, int radius); static QImage addShadow(const QImage & image, QColor color, QPoint offset, bool canResize = false); static QImage colorized(const QImage & image, QColor color); static QImage opacitized(const QImage & image, double opacity = 0.5); static QImage addSpace(const QImage & image, int left, int top, int right, int bottom); static QImage rotatedImage(const QImage & image, qreal angle); static QColor resolveColor(const QString & name); }; 

рдпрд╣ рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреЗрдЦреЗрдВ):



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

рдЖрдЧреЗ рдФрд░ рднреА рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред

рднреВрд░реЗ рд░рдВрдЧред


рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рднреА рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЛ рдХреЛ рдЪреБрдирдХрд░ рд▓рд╛рддрд╛ рд╣реВрдВред

рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЫрд╡рд┐ рдХреЛ QImage :: Format_Indexed8 рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд 8-рдмрд┐рдЯ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓рдирд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдлреЗрдж рд╕реЗ рдХрд╛рд▓реЗ рддрдХ - 256 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ "рд░рдВрдЧ рдорд╛рдирдЪрд┐рддреНрд░" рдмрдирд╛рдПрдВред

 QImage gray(image.size(), QImage::Format_ARGB32); gray.fill(Qt::transparent); static QVector<QRgb> monoTable; if (monoTable.isEmpty()) { for (int i = 0; i <= 255; i++) monoTable.append(qRgb(i, i, i)); } QPainter p(&gray); p.drawImage(0, 0, image.convertToFormat(QImage::Format_Indexed8, monoTable)); p.end(); return gray; 

рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЫрд╡рд┐ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░реЗ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

 QImage img = image; if (!image.isNull()) { int pixels = img.width() * img.height(); if (pixels*(int)sizeof(QRgb) <= img.byteCount()) { QRgb *data = (QRgb *)img.bits(); for (int i = 0; i < pixels; i++) { int val = qGray(data[i]); data[i] = qRgba(val, val, val, qAlpha(data[i])); } } } return img; 

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

рдЧреЛрд▓ рдХреЛрдиреЛрдВ


рдпрд╣рд╛рдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕ рдкрд░ рдЫрд╡рд┐ рдмрдирд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди QPainter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рд╕реНрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рдЕрд╕рдлрд▓ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж: [Ellipse | Arc |ededRect | Path], рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдЯреНрдЯрд┐рдХрд╛ рд░реЗрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдгрд╛рдо рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдмрд┐рдЯрдорд╕реНрдХ рдХреЗ рд▓рд┐рдП рдПрдВрдЯреАрдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд░рдВрдЧ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрджред рдирдИ рд╡рд┐рдзрд┐ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рд╣рдВрд╕рддреА рд╣реИ, рдФрд░ рдПрдВрдЯреА-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд┐рдХрдиреА рдкрдЯреНрдЯрд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЛрдЯреА рджреЗрддреА рд╣реИред

 QImage shapeImg(QSize(size, size), QImage::Format_ARGB32_Premultiplied); shapeImg.fill(Qt::transparent); QPainter sp(&shapeImg); sp.setRenderHint(QPainter::Antialiasing); sp.setPen(QPen(Qt::color1)); sp.setBrush(QBrush(Qt::color1)); sp.drawRoundedRect(QRect(0, 0, size, size), radius + 1, radius + 1); sp.end(); QImage roundSquaredImage(size, size, QImage::Format_ARGB32_Premultiplied); roundSquaredImage.fill(Qt::transparent); QPainter p(&roundSquaredImage); p.drawImage(0, 0, shapeImg); p.setCompositionMode(QPainter::CompositionMode_SourceIn); p.drawImage(0, 0, squared(image, size)); p.end(); return roundSquaredImage; 

рд╕рд╛рд░ рд▓рдЧрднрдЧ рддрд╕реНрд╡реАрд░ рдХреЛ рдорд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХ рдЧреЛрд▓ рдХрд╛рд▓рд╛ рд╡рд░реНрдЧ (рдПрдВрдЯреАрдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде) рдмрдирд╛рдПрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ QPainter::CompositionMode_SourceIn рдореЛрдб QPainter::CompositionMode_SourceIn рд╕рд╛рде рдореВрд▓ рдЫрд╡рд┐ рдмрдирд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд╕рд░рд▓ рдФрд░ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯред

рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝реЗрдВ


рдЕрдм рдЫрд╡рд┐ рдкрд░ рдПрдХ рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЪрд┐рддреНрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореВрд▓ рд╕реЗ рднрд┐рдиреНрди рдЖрдпрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

 QSize shadowedSize = image.size(); if (canResize) { shadowedSize += QSize(qAbs(offset.x()), qAbs(offset.y())); } QImage shadowed(shadowedSize, QImage::Format_ARGB32_Premultiplied); shadowed.fill(Qt::transparent); QPainter p(&shadowed); QImage shadowImage(image.size(), QImage::Format_ARGB32_Premultiplied); shadowImage.fill(Qt::transparent); QPainter tmpPainter(&shadowImage); tmpPainter.setCompositionMode(QPainter::CompositionMode_Source); tmpPainter.drawPixmap(QPoint(0, 0), QPixmap::fromImage(image)); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(shadowImage.rect(), color); tmpPainter.end(); QPoint shadowOffset = offset; if (canResize) { if (offset.x() < 0) shadowOffset.setX(0); if (offset.y() < 0) shadowOffset.setY(0); } p.drawImage(shadowOffset, shadowImage); QPoint originalOffset(0, 0); if (canResize) { if (offset.x() < 0) originalOffset.setX(qAbs(offset.x())); if (offset.y() < 0) originalOffset.setY(qAbs(offset.y())); } p.drawPixmap(originalOffset, QPixmap::fromImage(image)); p.end(); return shadowed; 

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

colorization


рд░рдВрдЧреАрдХрд░рдг рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдХреЛ рдЪреБрдирд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рдлрд▓ред

 QImage resultImage(image.size(), QImage::Format_ARGB32_Premultiplied); resultImage.fill(Qt::transparent); QPainter painter(&resultImage); painter.drawImage(0, 0, grayscaled(image)); painter.setCompositionMode(QPainter::CompositionMode_Screen); painter.fillRect(resultImage.rect(), color); painter.end(); resultImage.setAlphaChannel(image.alphaChannel()); return resultImage; 

рдпрд╣рд╛рдВ, рд╣рдо рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рдЧреНрд░реЗ рдХреЗ рд░рдВрдЧреЛрдВ рдореЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ (рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ), рдФрд░ рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рд░рдЪрдирд╛ рдореЛрдб рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рдХреА рдЖрдпрдд рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░реЗрдВред рдФрд░ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡


рдЕрдм рд╣рдо рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - QPainter::setOpacity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 QImage resultImage(image.size(), QImage::Format_ARGB32); resultImage.fill(Qt::transparent); QPainter painter(&resultImage); painter.setOpacity(opacity); painter.drawImage(0, 0, image); painter.end(); resultImage.setAlphaChannel(image.alphaChannel()); return resultImage; 


рдЪрд┐рддреНрд░ рдХреЛ рдШреБрдорд╛рдПрдВ


рд╣рдо рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдореЗрдВрдЧреЗред рдореИрдВ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рдмрд┐рдВрджреБ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рднреА рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЪрд┐рдХрдиреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред

 QImage rotated(image.size(), QImage::Format_ARGB32_Premultiplied); rotated.fill(Qt::transparent); QPainter p(&rotated); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); qreal dx = image.size().width() / 2.0, dy = image.size().height() / 2.0; p.translate(dx, dy); p.rotate(angle); p.translate(-dx, -dy); p.drawImage(0, 0, image); p.end(); return rotated; 

рдЧреНрд░реИрдВрдб рдлрд╛рдЗрдирд▓


рдпрд╣реА рд╣реИ, рдЕрдм рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ GitHub 'рд╕реЗ рдореЗрд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ) рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ!

рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕реЗ рд░рдВрдЧ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рд░реНрдп рдХрд░реВрдБрдЧрд╛ред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, Qt рдХреЛ #RRGGBBAA рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░рдВрдЧ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдерд╛:
 QColor ImageManager::resolveColor(const QString & name) { QColor color; if (QColor::isValidColor(name)) color.setNamedColor(name); else { // trying to parse "#RRGGBBAA" color if (name.length() == 9) { QString solidColor = name.left(7); if (QColor::isValidColor(solidColor)) { color.setNamedColor(solidColor); int alpha = name.right(2).toInt(0, 16); color.setAlpha(alpha); } } } if (!color.isValid()) qWarning() << QString("[ImageManager::resolveColor] Can\'t parse color: %1").arg(name); return color; } 

рдЗрд╕реА рд╕рдордп, рд╕рднреА рдорд╛рдирдХ рд░рдВрдЧ (рдЬреИрд╕реЗ white , transparent , #ffa0ee ) рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред

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

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

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


All Articles