通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Udp的项目。
C:\Users\Minwei\Projects\Qt\Udp\Udp.qrc:
xxxxxxxxxx
81<RCC>
2 <qresource prefix="/">
3 <file>images/abort.bmp</file>
4 <file>images/bind.bmp</file>
5 <file>images/clear.bmp</file>
6 <file>images/exit.bmp</file>
7 </qresource>
8</RCC>
C:\Users\Minwei\Projects\Qt\Udp\udpwindow.ui:
xxxxxxxxxx
2561
2<ui version="4.0">
3 <class>UdpWindow</class>
4 <widget class="QMainWindow" name="UdpWindow">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>696</width>
10 <height>557</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>UDP</string>
15 </property>
16 <widget class="QWidget" name="m_central">
17 <layout class="QVBoxLayout" name="m_layoutVer">
18 <item>
19 <layout class="QHBoxLayout" name="m_layoutTop">
20 <item>
21 <widget class="QLabel" name="m_labLocalAddr">
22 <property name="sizePolicy">
23 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
24 <horstretch>0</horstretch>
25 <verstretch>0</verstretch>
26 </sizepolicy>
27 </property>
28 <property name="text">
29 <string>本地地址:</string>
30 </property>
31 </widget>
32 </item>
33 <item>
34 <widget class="QComboBox" name="m_comboLocalAddr">
35 <item>
36 <property name="text">
37 <string>0.0.0.0</string>
38 </property>
39 </item>
40 <item>
41 <property name="text">
42 <string>127.0.0.1</string>
43 </property>
44 </item>
45 </widget>
46 </item>
47 <item>
48 <widget class="QLabel" name="m_labLocalPort">
49 <property name="sizePolicy">
50 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
51 <horstretch>0</horstretch>
52 <verstretch>0</verstretch>
53 </sizepolicy>
54 </property>
55 <property name="text">
56 <string>本地端口:</string>
57 </property>
58 </widget>
59 </item>
60 <item>
61 <widget class="QLineEdit" name="m_editLocalPort">
62 <property name="sizePolicy">
63 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
64 <horstretch>0</horstretch>
65 <verstretch>0</verstretch>
66 </sizepolicy>
67 </property>
68 <property name="text">
69 <string>8000</string>
70 </property>
71 </widget>
72 </item>
73 <item>
74 <widget class="QLabel" name="m_labRemoteAddr">
75 <property name="sizePolicy">
76 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
77 <horstretch>0</horstretch>
78 <verstretch>0</verstretch>
79 </sizepolicy>
80 </property>
81 <property name="text">
82 <string>远程地址:</string>
83 </property>
84 </widget>
85 </item>
86 <item>
87 <widget class="QLineEdit" name="m_editRemoteAddr">
88 <property name="sizePolicy">
89 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
90 <horstretch>0</horstretch>
91 <verstretch>0</verstretch>
92 </sizepolicy>
93 </property>
94 <property name="text">
95 <string>127.0.0.1</string>
96 </property>
97 </widget>
98 </item>
99 <item>
100 <widget class="QLabel" name="m_labRemotePort">
101 <property name="sizePolicy">
102 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
103 <horstretch>0</horstretch>
104 <verstretch>0</verstretch>
105 </sizepolicy>
106 </property>
107 <property name="text">
108 <string>远程端口:</string>
109 </property>
110 </widget>
111 </item>
112 <item>
113 <widget class="QLineEdit" name="m_editRemotePort">
114 <property name="sizePolicy">
115 <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
116 <horstretch>0</horstretch>
117 <verstretch>0</verstretch>
118 </sizepolicy>
119 </property>
120 <property name="text">
121 <string>8000</string>
122 </property>
123 </widget>
124 </item>
125 </layout>
126 </item>
127 <item>
128 <widget class="QPlainTextEdit" name="m_editOutput">
129 <property name="frameShape">
130 <enum>QFrame::WinPanel</enum>
131 </property>
132 <property name="readOnly">
133 <bool>true</bool>
134 </property>
135 </widget>
136 </item>
137 <item>
138 <layout class="QHBoxLayout" name="m_layoutBottom">
139 <item>
140 <widget class="QLineEdit" name="m_editSend">
141 <property name="text">
142 <string>Hello World</string>
143 </property>
144 </widget>
145 </item>
146 <item>
147 <widget class="QPushButton" name="m_btnSend">
148 <property name="text">
149 <string>发送</string>
150 </property>
151 <property name="default">
152 <bool>true</bool>
153 </property>
154 </widget>
155 </item>
156 </layout>
157 </item>
158 </layout>
159 </widget>
160 <widget class="QStatusBar" name="m_statusBar"/>
161 <widget class="QToolBar" name="m_toolBar">
162 <property name="windowTitle">
163 <string>工具栏</string>
164 </property>
165 <property name="toolButtonStyle">
166 <enum>Qt::ToolButtonTextBesideIcon</enum>
167 </property>
168 <attribute name="toolBarArea">
169 <enum>TopToolBarArea</enum>
170 </attribute>
171 <attribute name="toolBarBreak">
172 <bool>false</bool>
173 </attribute>
174 <addaction name="m_actBind"/>
175 <addaction name="m_actAbort"/>
176 <addaction name="m_actClear"/>
177 <addaction name="separator"/>
178 <addaction name="m_actExit"/>
179 </widget>
180 <action name="m_actBind">
181 <property name="icon">
182 <iconset resource="Udp.qrc">
183 <normaloff>:/images/bind.bmp</normaloff>:/images/bind.bmp</iconset>
184 </property>
185 <property name="text">
186 <string>绑定</string>
187 </property>
188 </action>
189 <action name="m_actAbort">
190 <property name="icon">
191 <iconset resource="Udp.qrc">
192 <normaloff>:/images/abort.bmp</normaloff>:/images/abort.bmp</iconset>
193 </property>
194 <property name="text">
195 <string>解绑</string>
196 </property>
197 <property name="toolTip">
198 <string>解绑</string>
199 </property>
200 </action>
201 <action name="m_actClear">
202 <property name="icon">
203 <iconset resource="Udp.qrc">
204 <normaloff>:/images/clear.bmp</normaloff>:/images/clear.bmp</iconset>
205 </property>
206 <property name="text">
207 <string>清空</string>
208 </property>
209 <property name="toolTip">
210 <string>清空</string>
211 </property>
212 </action>
213 <action name="m_actExit">
214 <property name="icon">
215 <iconset resource="Udp.qrc">
216 <normaloff>:/images/exit.bmp</normaloff>:/images/exit.bmp</iconset>
217 </property>
218 <property name="text">
219 <string>退出</string>
220 </property>
221 <property name="toolTip">
222 <string>退出</string>
223 </property>
224 </action>
225 </widget>
226 <tabstops>
227 <tabstop>m_comboLocalAddr</tabstop>
228 <tabstop>m_editLocalPort</tabstop>
229 <tabstop>m_editRemoteAddr</tabstop>
230 <tabstop>m_editRemotePort</tabstop>
231 <tabstop>m_editOutput</tabstop>
232 <tabstop>m_editSend</tabstop>
233 <tabstop>m_btnSend</tabstop>
234 </tabstops>
235 <resources>
236 <include location="Udp.qrc"/>
237 </resources>
238 <connections>
239 <connection>
240 <sender>m_actExit</sender>
241 <signal>triggered()</signal>
242 <receiver>UdpWindow</receiver>
243 <slot>close()</slot>
244 <hints>
245 <hint type="sourcelabel">
246 <x>-1</x>
247 <y>-1</y>
248 </hint>
249 <hint type="destinationlabel">
250 <x>399</x>
251 <y>299</y>
252 </hint>
253 </hints>
254 </connection>
255 </connections>
256</ui>
C:\Users\Minwei\Projects\Qt\Udp\udpwindow.h:
xxxxxxxxxx
411
2
3
4
5
6
7
8QT_BEGIN_NAMESPACE
9namespace Ui { class UdpWindow; }
10QT_END_NAMESPACE
11
12class UdpWindow : public QMainWindow
13{
14 Q_OBJECT
15
16public:
17 UdpWindow(QWidget *parent = nullptr);
18 ~UdpWindow();
19
20private slots:
21 void on_m_actBind_triggered();
22 void on_m_actAbort_triggered();
23 void on_m_actClear_triggered();
24
25 void on_m_btnSend_clicked();
26
27 void on_m_socket_readyRead();
28
29 void on_m_socket_stateChanged(
30 QAbstractSocket::SocketState socketState);
31 void on_m_socket_error(
32 QAbstractSocket::SocketError socketError);
33
34private:
35 Ui::UdpWindow *ui;
36 QLabel* m_labSocketState;
37 QLabel* m_labSocketError;
38 QUdpSocket* m_socket;
39};
40
41// UDPWINDOW_H
C:\Users\Minwei\Projects\Qt\Udp\udpwindow.cpp:
xxxxxxxxxx
1151
2
3
4
5
6
7UdpWindow::UdpWindow(QWidget *parent)
8 : QMainWindow(parent)
9 , ui(new Ui::UdpWindow)
10 , m_labSocketState(new QLabel("套接字状态:"))
11 , m_labSocketError(new QLabel(" 套接字错误:"))
12 , m_socket(new QUdpSocket(this))
13{
14 ui->setupUi(this);
15
16 for (QHostAddress address : QHostInfo::fromName(
17 QHostInfo::localHostName()).addresses())
18 if(address.protocol() == QAbstractSocket::IPv4Protocol)
19 ui->m_comboLocalAddr->addItem(address.toString());
20
21 m_labSocketState->setMinimumWidth(298);
22 ui->m_statusBar->addWidget(m_labSocketState);
23 m_labSocketError->setMinimumWidth(298);
24 ui->m_statusBar->addWidget(m_labSocketError);
25
26 connect(m_socket, SIGNAL(readyRead()),
27 this, SLOT(on_m_socket_readyRead()));
28
29 connect(m_socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
30 this, SLOT(on_m_socket_stateChanged(QAbstractSocket::SocketState)));
31 connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)),
32 this, SLOT(on_m_socket_error(QAbstractSocket::SocketError)));
33}
34
35UdpWindow::~UdpWindow()
36{
37 delete ui;
38}
39
40void UdpWindow::on_m_actBind_triggered()
41{
42 QHostAddress address(ui->m_comboLocalAddr->currentText());
43 quint16 port = ui->m_editLocalPort->text().toUShort();
44
45 if (m_socket->bind(address, port))
46 ui->m_editOutput->appendPlainText(QString("绑定%1:%2成功").
47 arg(address.toString()).arg(port));
48 else
49 ui->m_editOutput->appendPlainText(QString("绑定%1:%2失败").
50 arg(address.toString()).arg(port));
51}
52
53void UdpWindow::on_m_actAbort_triggered()
54{
55 m_socket->abort();
56
57 ui->m_editOutput->appendPlainText("解除绑定");
58}
59
60void UdpWindow::on_m_actClear_triggered()
61{
62 ui->m_editOutput->clear();
63}
64
65void UdpWindow::on_m_btnSend_clicked()
66{
67 QByteArray datagram(ui->m_editSend->text().toUtf8());
68 QHostAddress address(ui->m_editRemoteAddr->text());
69 quint16 port = ui->m_editRemotePort->text().toUShort();
70
71 qint64 nbytes = m_socket->writeDatagram(datagram, address, port);
72
73 if (nbytes == -1)
74 ui->m_editOutput->appendPlainText("发送失败");
75 else
76 ui->m_editOutput->appendPlainText(QString("向%1:%2发送%3字节:%4").
77 arg(address.toString()).arg(port).
78 arg(nbytes).arg(QString(datagram)));
79}
80
81void UdpWindow::on_m_socket_readyRead()
82{
83 while (m_socket->hasPendingDatagrams())
84 {
85 QByteArray datagram(m_socket->pendingDatagramSize(), 0);
86 QHostAddress address;
87 quint16 port;
88
89 qint64 nbytes = m_socket->readDatagram(
90 datagram.data(), datagram.size(), &address, &port);
91
92 if (nbytes == -1)
93 ui->m_editOutput->appendPlainText("接收失败");
94 else
95 ui->m_editOutput->appendPlainText(QString("从%1:%2接收%3字节:%4").
96 arg(QHostAddress(address.toIPv4Address()).toString()).
97 arg(port).arg(nbytes).arg(QString(datagram)));
98 }
99}
100
101void UdpWindow::on_m_socket_stateChanged(
102 QAbstractSocket::SocketState socketState)
103{
104 m_labSocketState->setText(QString("套接字状态:%1").arg(
105 QMetaEnum::fromType<QAbstractSocket::SocketState>().
106 valueToKey(socketState)));
107}
108
109void UdpWindow::on_m_socket_error(
110 QAbstractSocket::SocketError socketError)
111{
112 m_labSocketError->setText(QString(" 套接字错误:%1").arg(
113 QMetaEnum::fromType<QAbstractSocket::SocketError>().
114 valueToKey(socketError)));
115}
运行效果如图所示: