Čínská společnost Tencent uvolnila svůj AI model HunyuanWorld-Voyager pro generování videí 3D světů z jednoho obrázku a určené trajektorie kamery. Licence ale nedovoluje jeho používání na území Evropské unie, Spojeného království a Jižní Koreje.
Blender Studio se spojilo s kapelou OK Go a výsledkem je videoklip k písni Impulse Purchase. Stejně jako samotný 3D software Blender je i ve videoklipu použitý animovaný chlápek open source. Kdokoli si jej může stáhnout a upravovat.
Zig Software Foundation stojící za programovacím jazykem Zig publikovala finanční zprávu za rok 2024. Současně s prosbou o finanční příspěvek.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za srpen (YouTube). Vypíchnuta je podpora Tabulek Google, implementace Gamepad API a Cookie Store API nebo také podpora WebGL na Linuxu.
openSUSE Leap 16, včetně Leap Micra 6.2+, nově nabízí 24 měsíců podpory pro každé vydání. To je dva roky aktualizací a stability, což z něj činí nejdéle podporovanou komunitní distribuci vůbec. Leap se tak stává ideální platformou pro všechny, kdo hledají moderní, stabilní a dlouhodobě podporovanou komunitní Linux distribuci.
Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) vydal dne 3. 9. 2025 VAROVÁNÍ před hrozbou v oblasti kybernetické bezpečnosti spočívající v předávání systémových a uživatelských dat do Čínské lidové republiky a ve vzdálené správě technických aktiv vykonávané z území Čínské lidové republiky. Varováním se musí zabývat povinné osoby podle zákona o kybernetické bezpečnosti.
Americká internetová společnost Google nemusí prodat svůj prohlížeč Chrome ani operační systém Android. Rozhodl o tom soud ve Washingtonu, který tak zamítl požadavek amerického ministerstva spravedlnosti. Soud ale firmě nařídil sdílet data s jinými podniky v zájmu posílení konkurence v oblasti internetového vyhledávání. Zároveň Googlu zakázal uzavírat dohody s výrobci mobilních a dalších zařízení, které by znemožňovaly
… více »Prvního září ozbrojení policisté zatkli na na londýnském letišti Heathrow scénáristu a režiséra Grahama Linehana, známého především komediálními seriály Ajťáci, Otec Ted nebo Black Books. Během výslechu měl 57letý Graham nebezpečně zvýšený krevní tlak až na samou hranici mrtvice a proto byl z policejní stanice převezen do nemocnice. Důvodem zatčení bylo údajné podněcování násilí v jeho 'vtipných' příspěvcích na sociální síti
… více »Studentská dílna Macgyver zve na další Virtuální Bastlírnu - pravidelné online setkání všech, kdo mají blízko k bastlení, elektronice, IT, vědě a technice. Letní prázdniny jsou za námi a je čas probrat novinky, které se přes srpen nahromadily. Tentokrát jich je více než 50! Těšit se můžete mimo jiné na:
Hardware – Bus Pirate na ESP32, reverse engineering Raspberry Pi, pseudo-ZX-80 na RISC-V, PicoCalc, organizéry na nářadí z pěny nebo … více »Google Chrome 140 byl prohlášen za stabilní. Nejnovější stabilní verze 140.0.7339.80 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 6 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Práci s protokoly HTTP a FTP implementují třídy QHttp
a QFtp
, které jsou v Qt dostupné už mnoho let. Ve verzi 4.4 se objevila třída QNetworkAccessManager
, která poskytuje jednodušší, ale přesto mocnější API a vývojáři doporučují její použití v nových programech.
Síťování je asynchronní a využívá technologie signálů a slotů. Pošlete požadavek, vytvoří se objekt s odpovědí a tento objekt potom vyšle signál, když je požadavek vyřízený nebo když dojde k chybě.
Při vytváření projektů pracujících s modulem QtNetwork v Qt Creatoru si nezapomeňte modul vyžádat. Pokud projekt vytváříte ručně, tak si do .pro souboru přidejte řádek QT += network
.
Ukážeme si, jak poslat HTTP požadavek GET a vypsat získané hlavičky. Program funguje takto:
$ ./httphead http://www.abclinuxu.cz/ Expires: Fri, 22 Dec 2000 05:00:00 GMT Set-Cookie: JSESSIONID=5117noj9m1ik;Path=/ Content-Type: text/html; charset=utf-8 Last-Modified: Thu, 27 Aug 2009 13:38:35 GMT Cache-Control: no-cache, must-revalidate Pragma: no-cache Content-Encoding: gzip Server: Jetty(6.1.11)
http.h
: API.
#ifndef HTTP_H #define HTTP_H #include <QObject> #include <QNetworkReply> #include <QTextStream> class QNetworkAccessManager; class HTTP : public QObject { Q_OBJECT public: HTTP(); int run(); private: QNetworkAccessManager *manager; // objekt pro zápis na std. výstup QTextStream cout; private slots: void gotReply(QNetworkReply* reply); void gotError(QNetworkReply::NetworkError); }; #endif // HTTP_H
http.cpp
#include "http.h" /* #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QStringList> */ // includne celý modul QtNetwork, který s sebou vtáhne QtCore #include <QtNetwork> // tohle potřebujeme pro stdout #include <cstdio> HTTP::HTTP() : cout(stdout, QIODevice::WriteOnly) { manager = new QNetworkAccessManager(this); // spojíme signál značící vyřízení požadavku se slotem, // který zpracuje odpověď connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(gotReply(QNetworkReply*))); } int HTTP::run() { // zkontrolujeme počet argumentů, případně vypíšeme nápovědu QStringList args = qApp->arguments(); if(args.size() != 2) { cout << "usage: " << args.at(0) << " [http url]\n"; cout.flush(); // odsud nelze ukončit program běžným způsobem, // vysvětlení najdete u souboru main.cpp return 1; } QString url = args.at(1); // pošleme HTTP požadavek HEAD na dané URL, uložíme si ukazatel na odpověď QNetworkReply* reply = manager->head(QNetworkRequest(QUrl(url))); // spojíme odpověď se slotem, který zpracuje případnou chybu connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(gotError(QNetworkReply::NetworkError))); return 0; } // vypíše všechny hlavičky a ukončí program void HTTP::gotReply(QNetworkReply* reply) { foreach(QByteArray header, reply->rawHeaderList()) { QByteArray value = reply->rawHeader(header); cout << header << ": " << value << "\n"; } cout.flush(); qApp->exit(0); } // vypíše chybu a ukončí program void HTTP::gotError(QNetworkReply::NetworkError e) { switch(e) { case QNetworkReply::NoError: break; case QNetworkReply::ConnectionRefusedError: cout << tr("connection refused") << "\n"; break; case QNetworkReply::RemoteHostClosedError: cout << tr("the remote server closed the connection") << "\n"; break; case QNetworkReply::HostNotFoundError: cout << tr("host not found") << "\n"; break; case QNetworkReply::TimeoutError: cout << tr("connection timed out") << "\n"; break;) case QNetworkReply::ProtocolUnknownError: cout << tr("unknown protocol (did you forget http:// ?)") << "\n"; break; default: cout << tr("an error occured") << "\n"; break; } cout.flush(); qApp->exit(2); }
main.cpp
: V metodě run()
nelze ukončit program klasickým způsobem, protože ještě neběží smyčka událostí. Jelikož zde program ukončit potřebujeme (pokud uživatel nezadá argument – URL), tak jsem zvolil jedno z mnoha řešení, jak to obejít.
#include <QCoreApplication> #include "http.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); HTTP main; if(main.run() != 0) return 1; return a.exec(); }
Zdrojáky si můžete stáhnout v archívu httphead.tar.bz2.
Jelikož má QNetworkAccessManager
takové pěkné rozhraní pro stahování souborů, rozhodl jsem se předvést zde metodu get()
právě pro stahování z FTP.
Výstup programu vypadá následovně:
$ ./ftpget ftp://gentoo.mirror.web4u.cz/releases/amd64/autobuilds/20090716/install-amd64-minimal-20090716.iso downloaded 121188352 bytes (out of 121188352), which is 100% download finished, file saved as install-amd64-minimal-20090716.iso $ ./ftpget http://gentoo.mirror.web4u.cz/snapshots/portage-20090818.tar.bz2 downloaded 36430733 bytes (out of 36430733), which is 100% download finished, file saved as portage-20090818.tar.bz2
ftpget.h
: API.
#ifndef FTPGET_H #define FTPGET_H #include <QObject> #include <QTextStream> #include <QNetworkReply> class QFile; class QNetworkAccessManager; class FtpGet : public QObject { Q_OBJECT public: FtpGet(); int run(); private: QFile* file; QString fileName; QNetworkAccessManager* manager; QNetworkReply* reply; QTextStream cout; private slots: void downloadFinished(QNetworkReply*); void showProgress(qint64, qint64); void writeData(); void handleError(QNetworkReply::NetworkError); }; #endif // FTPGET_H
ftpget.cpp
:
#include "ftpget.h" #include <QtNetwork> FtpGet::FtpGet() : cout(stdout, QIODevice::WriteOnly) { manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadFinished(QNetworkReply*))); } int FtpGet::run() { // zkontrolujeme počet argumentů, případně vypíšeme nápovědu QStringList args = qApp->arguments(); if(args.size() != 2) { cout << "usage: " << args.at(0) << " [ftp://file]\n"; cout.flush(); return 1; } QUrl url(args.at(1)); // získáme z URL název souboru fileName = url.path().split('/').last(); if(fileName.isEmpty()) fileName = QString("file_from_%1").arg(url.host()); // otevřeme soubor pro zápis file = new QFile(fileName); if(!file->open(QIODevice::WriteOnly)) { cout << "could not open the file (" << fileName << ")\n"; cout.flush(); return 1; } // začneme stahovat reply = manager->get(QNetworkRequest(url)); // propojíme signály s funkcemi pro zápis, výpis průběhu a zpracování chyb connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(showProgress(qint64,qint64))); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError(QNetworkReply::NetworkError))); connect(reply, SIGNAL(readyRead()), this, SLOT(writeData())); return 0; } // zapíše průběžně stažená data void FtpGet::writeData() { file->write(reply->readAll()); } // zavře soubor, informuje o dokončení stahování a ukončí program void FtpGet::downloadFinished(QNetworkReply* reply) { Q_UNUSED( reply ) if(file && file->isOpen()) file->close(); cout << QString("\ndownload finished, file saved as %1\n").arg(fileName); cout.flush(); qApp->quit(); } // vypíše průběh stahování void FtpGet::showProgress(qint64 dl, qint64 all) { // procenta int perc = 0; // spočítá kolik procent je staženo (pokud to lze) if(dl > 0 && all > 0) perc = dl / (all / 100); // pomocný řetězec s celkovou velikostí QString sizestr = (all == -1) ? "[unknown total size]" : QString::number(all); // pomocný řetězec s procenty QString percstr = ""; if (perc != 0) percstr = QString(", which is %1%").arg(perc); // vypíše info o průběhu stahování cout << QString("\rdownloaded %1 bytes (out of %2)").arg(dl).arg(sizestr) << percstr << "\t\t"; } // zpracuje chybu (v tomto případě jen vypíše chybový kód, viz první program pro úplné řešení) void FtpGet::handleError(QNetworkReply::NetworkError e) { cout << "\nan error ocurred (code #" << e << "), see http://qt.nokia.com/doc/qnetworkreply.html#NetworkError-enum\n"; qApp->exit(2); }
main.cpp
:
#include <QCoreApplication> #include "ftpget.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); FtpGet main; if(main.run() != 0) return 1; return a.exec(); }
Zdrojáky si můžete stáhnout v archívu ftpget.tar.bz2.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Zdravim,
mozno mi niekto bude vediet poradit - ked som posledne robil s metodami ktore pracuju s HTTP/HTTPS napriek tomu ze Qt network je deklarovane ako asynchronne na Windows strojoch to sposobovalo "zamrznutie" UI aplikacie pri poziadavkach na server. Ked som to prehnal cez gdb tak Qt vytvoralo cca 5-6 threadov na kazde volanie. Nevie niekto cim to moze byt sposobovane? Vyskytovalo sa to len na Windows, Qt bolo verzie 4.2.2.
Zkus aktuální verzi Qt (dnes 4.5.2) a případně nahlaš chybu vývojářům (viz web qt.nokia.com). Půjde o windows-specific bug.
Pokud to zatím potřebuješ obejít, tak síťování dělej v odděleném vlákně QThread.
finished
spojuješ se slotem gotReply
/downloadFinished
už v konstruktoru, zatímco všechny ostatní až v metodě run
(a to dokonce teprve poté, co spustíš samotné stahování)? Intuitivně bych to všechno dělal na jednom místě (asi v run
před zahájením stahování)…
Jak korektne implementovat void QTcpServer::incomingConnection ( int socketDescriptor ) pro potomka tridy QTcpServer? Prijde mi, ze to neni mozne. Ta metoda je virtualni, aby mohla byt prepsana. Ale jeji implementace v QTcpServer vyuziva privatni funkce, takze kdyz ji chce nekdo implementovat znovu, nemuze podle me zajistit stejnou funkcnost.
QTcpServer::incomingConnection(socketDescriptor);