Qt in Education Sieć I drukowanie. 1
Tłumaczenie i adaptacja: dr inż. Piotr Kaczmarka na podstawie kursu na podstawie materiału Diga Plc. Materiały służą do prowadzenia zajęć z informatyki dla studentów Automatyki i Robotyki Politechniki Poznańskiej. 2012 Digia Plc. The enclosed Qt Materials are provided under the Creative Commons Attribution-Share Alike 2.5 License Agreement. The full license text is available here: http://creativecommons.org/licenses/by-sa/2.5/legalcode. Digia, Qt and the Digia and Qt logos are the registered trademarks of Digia Plc. in Finland and other countries worldwide. 2
Sieć w Qt Moduł QtWebKit umożliwia renderowanie strony www bezpośredniow aplikacji, dostęp do javascript itp QNetworkAccessManager udostępnia interfejs do wysyłania i odbierania zapytań przez sieć QFtp implementuje klienta ftp QTcpSocket i QTcpServer udostępniają mechanizmy protokołu TCP QsslSocket udostępnia szyfrowany protoków TCP QUdpSocket Udostępnia mechanizmy protokołu UDP 3
Protokoły HTTP, FTP, SMTP, POP, IMAP, etc Przeglądanie sieci przy użyciu Hyper-Text Transfer Protocol Kodowanego http: https TCP IP (IPv4 and IPv6) HTTP jest nadbudówką TCP opartego o protokół IP Innet protokoły wykorzystujące TCP/IP: FTP, SMTP, POP, IMAP 33
FTP Do obsługi służy klasa QFtp FTP umożliwia Zalogowanie na serwer Pobranie listy plików Przemiszczanie się w przestrzeni katalogów upload i download plików 34
Pobranie pliku przez FTP Żeby pobrać plik z ftp.qt.nokia.com/qt/source/readme używając QFtp muszą być zrealizowane następujące czynności connecttohost("ftp.qt.nokia.com") Podanie loginu i hasła get("/qt/source/readme") close 35
Podział URL klasa QUrl może być wykorzystana do podiału adresu na części ftp://ftp.qt.nokia.com/qt/sources/readme scheme host path QUrl url("ftp://ftp.qt.nokia.com/qt/sources/readme"); QString host = url.host(); QString path = url.path(); 36
Pobranie pliku przez FTP Każda komenda wydawana przez Qftp jest asynchroniczna Kiedy komenda zostaje wykonana zostaje wyemitowany sygnał commandfinished(int id, bool error) error jest true kiedy wykonanie nie powiodło się 37
Pobranie pliku przez FTP Żądania wykonania wszystkch komed mogą być wysłane za jednym razem Lub prosta maszyna stanów może być zbudowana void Downloader::start() { m_ftpstate = Connecting; m_ftp->connecttohost(host); void Downloader::ftpFinished(int, bool error) { switch(m_ftpstate) { case Connecting: m_ftpstate = LoggingIn; m_ftp->login(); break; case LoggingIn: m_ftpstate = Downloading; m_ftp->get(file, 0, QFtp::Ascii); break; case Downloading: result = m_ftp->readall(); m_ftpstate = Disconnecting; m_ftp->close(); break; case Disconnecting: m_ftpstate = Inactive; break; 38
Dostęp przez gniazda TCP Sockets UDP Sockets Gwarancja dostarczenia pakietu i zachowania kolejności pakietów Połączenie P2P Fire and forget P2P lub rozgłoszeniowy Wykorzystywany gdy priorytetem jest niezawodność połączenia Używany gdy priorytetem jest szybkość a nie niezawodność 40
Gniazda TCP W Qt są dwie klasy dla protokołu TCP QTcpSocket reprezentuje gniazdo TCP QTcpServer reprezentuje serwer (umożliwia nasłuch, akceptowanie połączeń) tworzy obiekt typu QTcpSocket dla każdego połączenia Dalej przedstawiono aplikację prostego serwera wykorzystującego napisy 41
Server TCP TCP Serwer nasłuchuje na porcie 55555 Przychodzące połączenie generuje sygnał newconnection Server::Server() : QObject(0) { m_tcpserver = new QTcpServer(this); connect(m_tcpserver, SIGNAL(newConnection()), this, SLOT(serverConnected())); m_tcpserver->listen(qhostaddress::any, 55555); 42
Serwer TCP Połączenie przychodzące jest odczytywane za pomocą metody nextpendingconnection void Server::serverConnected() { QTcpSocket *connection = m_tcpserver->nextpendingconnection(); connect(connection, SIGNAL(disconnected()), connection, SLOT(deleteLater())); QByteArray buffer;... connection->write(buffer); connection->disconnectfromhost(); 43
Serwer TCP Przykładowa odpowiedź serwera void Server::serverConnected() {... When using a QDataStream with a socket it is important to handle the size of the data manually. QByteArray buffer; QDataStream out(&buffer, QIODevice::WriteOnly); out.setversion(qdatastream::qt_4_6); QString greeting = QString("Hello! The time is %1").arg(QTime::currentTime().toString()); out << (quint16)0; out << greeting; out.device()->seek(0); out << (quint16)(buffer.size() - sizeof(quint16));... 44
Klient TCP Klasa QTcpSocket umożliwia nawiązanie połaczenia z serwerem Obsługa Sygnał readyread jest niezbędna, do uzyskania informacji o połączeniu, są również inne sygnały informujące np. o błędach Client::Client() : QObject(0) { m_tcpsocket = new QTcpSocket(this); connect(m_tcpsocket, SIGNAL(readyRead()), this, SLOT(readyToRead())); m_tcpsocket->connecttohost("localhost", 55555); 45
Klient TCP void Client::readyToRead() { QDataStream in(m_tcpsocket); in.setversion(qdatastream::qt_4_6); Using the QTcpSocket's buffer as our buffer if(m_tcpblocksize == 0) { if(m_tcpsocket->bytesavailable()<sizeof(quint16)) return; in >> m_tcpblocksize; if(m_tcpsocket->bytesavailable() < m_tcpblocksize) return; QString greeting; in >> greeting; dosomething(greeting); m_tcpblocksize = 0; 46
Drukowanie Do drukowania służy klasa Qprinter Najważniejsze metody: SetOutputFormat, SetOutputFileName SetPageMargins, setorientation Konfiguracja drukarki Okno konfiguracyjne drukarki zaimplementowane jest w klasie QprinterDialog Co można drukować Qpainter (umożliwia rysowanie elementów) QtextDocument (dokument posiadający interpretator richtext i html) 50
Tworzenie drukarki i Ustawienie parametrów wydruku Ustawienie drukarki QPrinter printer(qprinter::highresolution); QPrintDialog *dialog = new QPrintDialog(&printer, this); dialog->setwindowtitle(tr("tytul okna")); if (dialog->exec()!= QDialog::Accepted) return; Wydruk do PDF QPrinter printer; printer.setoutputformat(qprinter::pdfformat); printer.setoutputfilename("/foobar/nonwritable.pdf"); 51
Przygotowanie dokumentu Qpainter QPainter painter; if (! painter.begin(&printer)) { // failed to open file qwarning("failed to open file, is it writable?"); return 1; painter.drawtext(10, 10, "Test"); if (! printer.newpage()) { qwarning("failed in flushing page to disk, disk full?"); return 1; painter.drawtext(10, 10, "Test 2"); painter.end(); 52
Przygotowanie dokumentu QTextDocument Dla formatu html: Wspomaga większość elementów standardu (nagłowki, formatowanie czcionek, style css, div itp) QTextDocument doc; doc.sethtml(''tekst w html''); doc.print(&printer) Przykładowy kod generujący tabelkę: <table border="1"> <tr><th>header 1</th><th>Header 2</th></tr> <tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr> <tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr> </table> 53