Skip to content

Commit 5ef3cfd

Browse files
authored
Merge pull request #311 from rcalixte/add_websockets
Add WebSockets
2 parents 0d81a27 + ca48493 commit 5ef3cfd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+10512
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ examples/libraries/qt-svg/qt-svg
4141
examples/libraries/qt-uitools/qt-uitools
4242
examples/libraries/qt-webengine/qt-webengine
4343
examples/libraries/qt-webkit/qt-webkit
44+
examples/libraries/qt-websockets/qt-websockets
4445
examples/libraries/qt6-designer/qt6-designer
4546
examples/libraries/qt6-multimedia/qt6-multimedia
4647
examples/libraries/qt6-network-sctp/qt6-network-sctp
@@ -49,6 +50,7 @@ examples/libraries/qt6-pdf/qt6-pdf
4950
examples/libraries/qt6-positioning/qt6-positioning
5051
examples/libraries/qt6-uitools/qt6-uitools
5152
examples/libraries/qt6-webengine/qt6-webengine
53+
examples/libraries/qt6-websockets/qt6-websockets
5254
examples/libraries/restricted-extras-charts6/restricted-extras-charts6
5355
examples/libraries/restricted-extras-qscintilla/restricted-extras-qscintilla
5456

cmd/genbindings/config-libraries.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,20 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) {
200200
ClangMatchSameHeaderDefinitionOnly,
201201
)
202202

203+
// Qt 5 QWebSockets
204+
// Depends on QtCore
205+
generate(
206+
"qt/websockets",
207+
[]string{
208+
"/usr/include/x86_64-linux-gnu/qt5/QtWebSockets",
209+
},
210+
AllowAllHeaders,
211+
clangBin,
212+
pkgConfigCflags("Qt5WebSockets"),
213+
outDir,
214+
ClangMatchSameHeaderDefinitionOnly,
215+
)
216+
203217
// Qt 5 PDF
204218
// Depends on QtCore/Gui/Widgets
205219
generate(
@@ -519,7 +533,22 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) {
519533
ClangMatchSameHeaderDefinitionOnly,
520534
)
521535

536+
// Qt 6 QWebSockets
537+
// Depends on QtCore
538+
generate(
539+
"qt6/websockets",
540+
[]string{
541+
"/usr/include/x86_64-linux-gnu/qt6/QtWebSockets",
542+
},
543+
AllowAllHeaders,
544+
clangBin,
545+
"--std=c++17 "+pkgConfigCflags("Qt6WebSockets"),
546+
outDir,
547+
ClangMatchSameHeaderDefinitionOnly,
548+
)
549+
522550
// Qt 6 PDF
551+
// Depends on QtCore/Gui/Widgets
523552
generate(
524553
"qt6/pdf",
525554
[]string{

docker/genbindings.Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
1111
qttools5-dev \
1212
libqt5svg5-dev \
1313
libqt5webkit5-dev \
14+
libqt5websockets5-dev \
1415
qtwebengine5-dev \
1516
qt6-base-dev \
1617
qt6-charts-dev \
@@ -21,6 +22,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
2122
qt6-tools-dev \
2223
qt6-svg-dev \
2324
qt6-webengine-dev \
25+
qt6-websockets-dev \
2426
libqscintilla2-qt5-dev \
2527
libqscintilla2-qt6-dev \
2628
clang \
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"os"
6+
"strconv"
7+
"strings"
8+
9+
"github.com/mappu/miqt/qt"
10+
"github.com/mappu/miqt/qt/network"
11+
"github.com/mappu/miqt/qt/websockets"
12+
)
13+
14+
const (
15+
LOCAL_PORT = 12345
16+
NUM_CLIENTS = 3
17+
MAX_CLIENTS = 10
18+
OFFSET_X = 200
19+
)
20+
21+
var (
22+
clients = make(map[int]*websockets.QWebSocket, MAX_CLIENTS)
23+
clientDialogs = make(map[int]*ClientDialog, NUM_CLIENTS)
24+
)
25+
26+
type ClientDialog struct {
27+
name string
28+
dialog *qt.QDialog
29+
socket *websockets.QWebSocket
30+
messages *qt.QTextEdit
31+
input *qt.QLineEdit
32+
button *qt.QPushButton
33+
}
34+
35+
func NewClientDialog(name string, clientNumString string) *ClientDialog {
36+
var self ClientDialog
37+
38+
self.name = clientNumString
39+
40+
self.dialog = qt.NewQDialog2()
41+
self.dialog.SetWindowTitle(name)
42+
self.dialog.SetMinimumSize2(400, 300)
43+
44+
self.socket = websockets.NewQWebSocket()
45+
self.socket.SetParent(self.dialog.QWidget.QObject)
46+
47+
self.messages = qt.NewQTextEdit(self.dialog.QWidget)
48+
self.messages.SetReadOnly(true)
49+
50+
self.input = qt.NewQLineEdit(self.dialog.QWidget)
51+
self.input.SetPlaceholderText("Enter your message here")
52+
self.input.SetEnabled(false)
53+
54+
self.button = qt.NewQPushButton5("Send", self.dialog.QWidget)
55+
self.button.SetEnabled(false)
56+
57+
layout := qt.NewQVBoxLayout2()
58+
inputLayout := qt.NewQHBoxLayout2()
59+
60+
layout.AddWidget(self.messages.QWidget)
61+
inputLayout.AddWidget(self.input.QWidget)
62+
inputLayout.AddWidget(self.button.QWidget)
63+
layout.AddLayout(inputLayout.QLayout)
64+
self.dialog.SetLayout(layout.QLayout)
65+
66+
self.socket.OnConnected(func() {
67+
for _, client := range clientDialogs {
68+
if self.socket == client.socket {
69+
self.messages.Append("Connected!")
70+
self.input.SetEnabled(true)
71+
self.button.SetEnabled(true)
72+
self.input.SetFocus()
73+
return
74+
}
75+
}
76+
})
77+
78+
self.socket.OnTextMessageReceived(func(message string) {
79+
self.messages.Append(message)
80+
})
81+
82+
self.dialog.OnCloseEvent(func(super func(param1 *qt.QCloseEvent), param1 *qt.QCloseEvent) {
83+
for _, client := range clientDialogs {
84+
client.socket.Close()
85+
client.dialog.Delete()
86+
super(param1)
87+
}
88+
})
89+
90+
self.button.OnClicked(func() {
91+
message := strings.TrimSpace(self.input.Text())
92+
if message == "" {
93+
return
94+
}
95+
96+
self.socket.SendTextMessage("(" + self.name + "): " + message)
97+
self.messages.Append(">> " + message)
98+
self.input.Clear()
99+
})
100+
101+
return &self
102+
}
103+
104+
func (this *ClientDialog) ConnectToServer() {
105+
this.messages.Append("Connecting...")
106+
107+
url := qt.NewQUrl3("ws://localhost:" + strconv.Itoa(LOCAL_PORT))
108+
defer url.Delete()
109+
110+
this.socket.Open(url)
111+
}
112+
113+
func main() {
114+
qt.NewQApplication(os.Args)
115+
116+
server := websockets.NewQWebSocketServer("Example Qt WebSockets Server", websockets.QWebSocketServer__NonSecureMode)
117+
defer server.Delete()
118+
119+
localhost := network.NewQHostAddress8(network.QHostAddress__LocalHostIPv6)
120+
defer localhost.Delete()
121+
122+
if !server.Listen2(localhost, LOCAL_PORT) {
123+
errorMessage := server.ErrorString()
124+
log.Fatalln("Failed to listen on port " + strconv.Itoa(LOCAL_PORT) + ": " + errorMessage)
125+
}
126+
127+
for i := 0; i < NUM_CLIENTS; i++ {
128+
numStr := strconv.Itoa(i + 1)
129+
name := "Qt 5 WebSockets Example Client #" + numStr
130+
clientDialogs[i] = NewClientDialog(name, numStr)
131+
132+
clientDialogs[i].ConnectToServer()
133+
134+
clientDialogs[i].dialog.Show()
135+
width := clientDialogs[i].dialog.Width()
136+
y := clientDialogs[i].dialog.Y()
137+
clientDialogs[i].dialog.Move(OFFSET_X+(width+10)*i, y)
138+
}
139+
140+
clientNum := 0
141+
server.OnNewConnection(func() {
142+
client := server.NextPendingConnection()
143+
if clientNum >= MAX_CLIENTS {
144+
client.Close()
145+
return
146+
}
147+
148+
clients[clientNum] = client
149+
clientNum++
150+
151+
client.OnTextMessageReceived(func(message string) {
152+
for _, c := range clients {
153+
if client == c {
154+
continue
155+
}
156+
c.SendTextMessage(message)
157+
}
158+
})
159+
160+
client.OnDisconnected(func() {
161+
client.DeleteLater()
162+
})
163+
})
164+
165+
qt.QApplication_Exec()
166+
}
21 KB
Loading

0 commit comments

Comments
 (0)