第四步,实现获取快照数据的功能。
C:\Users\Minwei\Projects\Qt\Monitor\monitordialog.h:
xxxxxxxxxx
191...
2
3...
4class MonitorDialog : public QDialog
5{
6 ...
7private slots:
8 ...
9 void on_m_snapshotReply_readyRead();
10 ...
11private:
12 ...
13 QNetworkReply* m_snapshotReply;
14 QByteArray m_snapshotData;
15 QLabel* m_labels[4];
16 int m_index;
17 ...
18};
19...
C:\Users\Minwei\Projects\Qt\Monitor\monitordialog.cpp:
xxxxxxxxxx
501...
2MonitorDialog::MonitorDialog(QWidget *parent)
3 ...
4 , m_snapshotReply(Q_NULLPTR)
5 , m_index(0)
6 ...
7{
8 ...
9 m_labels[0] = ui->m_labSnapshot1;
10 m_labels[1] = ui->m_labSnapshot2;
11 m_labels[2] = ui->m_labSnapshot3;
12 m_labels[3] = ui->m_labSnapshot4;
13 ...
14}
15...
16void MonitorDialog::on_m_btnSnapshot_clicked()
17{
18 m_snapshotReply = m_access->get(QNetworkRequest(QUrl(
19 "http://192.168.0.111:8080?action=snapshot")));
20
21 connect(m_snapshotReply, SIGNAL(readyRead()),
22 this, SLOT(on_m_snapshotReply_readyRead()));
23}
24...
25void MonitorDialog::on_m_snapshotReply_readyRead()
26{
27 m_snapshotData += m_snapshotReply->readAll();
28
29 int begin = m_snapshotData.indexOf("\xff\xd8", 0);
30 if (begin == -1)
31 {
32 m_snapshotData.clear();
33 return;
34 }
35 int end = m_snapshotData.indexOf("\xff\xd9", begin + 2);
36 if (end == -1)
37 return;
38
39 QImage frame;
40 if (!frame.loadFromData(m_snapshotData.mid(begin, end + 2), "JPG"))
41 {
42 m_snapshotData.clear();
43 return;
44 }
45
46 m_snapshotData.clear();
47 m_labels[m_index]->setPixmap(QPixmap::fromImage(frame).scaledToHeight(236));
48 m_index = (m_index + 1) % 4;
49}
50...
运行效果如图所示: