Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ examples/libraries/qt-svg/qt-svg
examples/libraries/qt-uitools/qt-uitools
examples/libraries/qt-webengine/qt-webengine
examples/libraries/qt-webkit/qt-webkit
examples/libraries/qt-websockets/qt-websockets
examples/libraries/qt6-designer/qt6-designer
examples/libraries/qt6-multimedia/qt6-multimedia
examples/libraries/qt6-network-sctp/qt6-network-sctp
Expand All @@ -49,6 +50,7 @@ examples/libraries/qt6-pdf/qt6-pdf
examples/libraries/qt6-positioning/qt6-positioning
examples/libraries/qt6-uitools/qt6-uitools
examples/libraries/qt6-webengine/qt6-webengine
examples/libraries/qt6-websockets/qt6-websockets
examples/libraries/restricted-extras-charts6/restricted-extras-charts6
examples/libraries/restricted-extras-qscintilla/restricted-extras-qscintilla

Expand Down
29 changes: 29 additions & 0 deletions cmd/genbindings/config-libraries.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,20 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) {
ClangMatchSameHeaderDefinitionOnly,
)

// Qt 5 QWebSockets
// Depends on QtCore
generate(
"qt/websockets",
[]string{
"/usr/include/x86_64-linux-gnu/qt5/QtWebSockets",
},
AllowAllHeaders,
clangBin,
pkgConfigCflags("Qt5WebSockets"),
outDir,
ClangMatchSameHeaderDefinitionOnly,
)

// Qt 5 PDF
// Depends on QtCore/Gui/Widgets
generate(
Expand Down Expand Up @@ -519,7 +533,22 @@ func ProcessLibraries(clangBin, outDir, extraLibsDir string) {
ClangMatchSameHeaderDefinitionOnly,
)

// Qt 6 QWebSockets
// Depends on QtCore
generate(
"qt6/websockets",
[]string{
"/usr/include/x86_64-linux-gnu/qt6/QtWebSockets",
},
AllowAllHeaders,
clangBin,
"--std=c++17 "+pkgConfigCflags("Qt6WebSockets"),
outDir,
ClangMatchSameHeaderDefinitionOnly,
)

// Qt 6 PDF
// Depends on QtCore/Gui/Widgets
generate(
"qt6/pdf",
[]string{
Expand Down
2 changes: 2 additions & 0 deletions docker/genbindings.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
qttools5-dev \
libqt5svg5-dev \
libqt5webkit5-dev \
libqt5websockets5-dev \
qtwebengine5-dev \
qt6-base-dev \
qt6-charts-dev \
Expand All @@ -21,6 +22,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
qt6-tools-dev \
qt6-svg-dev \
qt6-webengine-dev \
qt6-websockets-dev \
libqscintilla2-qt5-dev \
libqscintilla2-qt6-dev \
clang \
Expand Down
166 changes: 166 additions & 0 deletions examples/libraries/qt-websockets/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
package main

import (
"log"
"os"
"strconv"
"strings"

"github.com/mappu/miqt/qt"
"github.com/mappu/miqt/qt/network"
"github.com/mappu/miqt/qt/websockets"
)

const (
LOCAL_PORT = 12345
NUM_CLIENTS = 3
MAX_CLIENTS = 10
OFFSET_X = 200
)

var (
clients = make(map[int]*websockets.QWebSocket, MAX_CLIENTS)
clientDialogs = make(map[int]*ClientDialog, NUM_CLIENTS)
)

type ClientDialog struct {
name string
dialog *qt.QDialog
socket *websockets.QWebSocket
messages *qt.QTextEdit
input *qt.QLineEdit
button *qt.QPushButton
}

func NewClientDialog(name string, clientNumString string) *ClientDialog {
var self ClientDialog

self.name = clientNumString

self.dialog = qt.NewQDialog2()
self.dialog.SetWindowTitle(name)
self.dialog.SetMinimumSize2(400, 300)

self.socket = websockets.NewQWebSocket()
self.socket.SetParent(self.dialog.QWidget.QObject)

self.messages = qt.NewQTextEdit(self.dialog.QWidget)
self.messages.SetReadOnly(true)

self.input = qt.NewQLineEdit(self.dialog.QWidget)
self.input.SetPlaceholderText("Enter your message here")
self.input.SetEnabled(false)

self.button = qt.NewQPushButton5("Send", self.dialog.QWidget)
self.button.SetEnabled(false)

layout := qt.NewQVBoxLayout2()
inputLayout := qt.NewQHBoxLayout2()

layout.AddWidget(self.messages.QWidget)
inputLayout.AddWidget(self.input.QWidget)
inputLayout.AddWidget(self.button.QWidget)
layout.AddLayout(inputLayout.QLayout)
self.dialog.SetLayout(layout.QLayout)

self.socket.OnConnected(func() {
for _, client := range clientDialogs {
if self.socket == client.socket {
self.messages.Append("Connected!")
self.input.SetEnabled(true)
self.button.SetEnabled(true)
self.input.SetFocus()
return
}
}
})

self.socket.OnTextMessageReceived(func(message string) {
self.messages.Append(message)
})

self.dialog.OnCloseEvent(func(super func(param1 *qt.QCloseEvent), param1 *qt.QCloseEvent) {
for _, client := range clientDialogs {
client.socket.Close()
client.dialog.Delete()
super(param1)
}
})

self.button.OnClicked(func() {
message := strings.TrimSpace(self.input.Text())
if message == "" {
return
}

self.socket.SendTextMessage("(" + self.name + "): " + message)
self.messages.Append(">> " + message)
self.input.Clear()
})

return &self
}

func (this *ClientDialog) ConnectToServer() {
this.messages.Append("Connecting...")

url := qt.NewQUrl3("ws://localhost:" + strconv.Itoa(LOCAL_PORT))
defer url.Delete()

this.socket.Open(url)
}

func main() {
qt.NewQApplication(os.Args)

server := websockets.NewQWebSocketServer("Example Qt WebSockets Server", websockets.QWebSocketServer__NonSecureMode)
defer server.Delete()

localhost := network.NewQHostAddress8(network.QHostAddress__LocalHostIPv6)
defer localhost.Delete()

if !server.Listen2(localhost, LOCAL_PORT) {
errorMessage := server.ErrorString()
log.Fatalln("Failed to listen on port " + strconv.Itoa(LOCAL_PORT) + ": " + errorMessage)
}

for i := 0; i < NUM_CLIENTS; i++ {
numStr := strconv.Itoa(i + 1)
name := "Qt 5 WebSockets Example Client #" + numStr
clientDialogs[i] = NewClientDialog(name, numStr)

clientDialogs[i].ConnectToServer()

clientDialogs[i].dialog.Show()
width := clientDialogs[i].dialog.Width()
y := clientDialogs[i].dialog.Y()
clientDialogs[i].dialog.Move(OFFSET_X+(width+10)*i, y)
}

clientNum := 0
server.OnNewConnection(func() {
client := server.NextPendingConnection()
if clientNum >= MAX_CLIENTS {
client.Close()
return
}

clients[clientNum] = client
clientNum++

client.OnTextMessageReceived(func(message string) {
for _, c := range clients {
if client == c {
continue
}
c.SendTextMessage(message)
}
})

client.OnDisconnected(func() {
client.DeleteLater()
})
})

qt.QApplication_Exec()
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading