Go + Nuklear

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Ciao a tutti!

Stavo studiando le varie librerie grafiche e, per il mio progetto, credo che Nuklear sia la libreria con più componenti "out of the box" con licenza MIT. Premetto che le uniche esperienze che ho avuto in campo di UI sono .NET/C# WPF tempo fa ed il classico stack tecnologico web.

Ho pensato di usare engine che sfruttano le tecnologie web (electron e simili), ma preferivo, anche per conoscenza personale, muovermi nel campo delle UI native.

Nuklear tra l'altro sfrutta nativamente SDL, OpenGL e Vulkan (tramite GLFW) etc.

Esiste un wrapper per go al seguente indirizzo: https://github.com/golang-ui/nuklear

Gli esempi però danno per scontato la conoscenza della libreria di base, la quale a sua volta ha una wiki non molto guarnita.

Sapreste darmi dei suggerimenti quindi su come cominciare a sviluppare un'interfaccia di base, con la spiegazione di ogni singola chiamata?

Grazie mille :)
 

Andretti60

Utente Èlite
6,440
5,091
Premetto che per lavoro principalmente sviluppo interfacce grafiche ad alto livello (ossia non usando i classici componenti che si trovano nelle suite di programmazione).
Qui siamo in un terreno che scotta, in quanto non esiste nessun standard. In pratica ogni sistema operativo ha il suo numero di librerie grafiche, ed esistono poche librerie in grado di produrre codice che possa essere compilato ed eseguito su piattaforme diverse. Che adesso sono, purtroppo, molteplici. Desktop, mobile, touchscreen, tastiera, mouse (di diversi tipi), pennino. Si diventa scemi.
Devi quindi prima decidere e specificare che tipo di interfaccia grafica vuoi sviluppare, in quale ambiente. Tieni conto che se vuoi applicazioni prestanti devi "andare nativo".
 
  • Mi piace
Reazioni: Giacomo Furlan

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Ciao Andretti60, grazie per l'informazione :)

Volendo targetizzare più sistemi operativi alla volta senza la necessità di avere un'interfaccia che si fonda con il sistema operativo sottostante, pensavo a librerie come GTK+, Qt, wxWidgets e compagnia bella.

In particolar modo nuklear sfrutta il motore grafico sottostante, quale OpenGL, D3D11, SDL, X11 per operare con un livello d'astrazione (di fatto Nuklear ha già fatto i binding ai vari motori e non ti rimane che scrivere il codice "universale" on top di questi) => https://github.com/vurtun/nuklear

Tra le altre cose la grafica delle demo è abbastanza appagante, in un contesto di una o più finestre nelle quali operare.
 

Andretti60

Utente Èlite
6,440
5,091
Ci sono pro e contro in ogni libreria, tieni anche presente che per prodotti commerciali Qt richiede la licenza (non so quanto sia). Un altro problems di Qt e' che e' grosso (non e' solo un widget). E' l'unico che io abbia usato, anni fa, per creare schermate in un pannello touchscreen, programmando in Linux.
Se io dovessi scegliere, sceglierei GTK, ma non conosco Nuklear (che e' recente) quindi non posso confrontare.

C'e' anche un'altra alternativa, ossia Python. Esistono pacchetti Python che ti permettono di scrivere applicazioni GUI ch epossono essere compilate in diverse piattaforme, incluso una interfaccia per Qt. Io uso tkinter per piccole applicazioni di uso domestico, o per piccoli esperimenti, sinceramente non lo userei per medie e grosse applicazioni. Ovviamente sappiamo le limitazioni di Python.
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Mmmm il vantaggio di Qt è che si adatta agli engine che stanno sotto (WinForms, GTK, etc). Gli svantaggi sono quelli che hai descritto.

GTK funziona bene solo su GNOME, sugli altri sistemi lascia un po' a desiderare (grafica GNOME su KDE, Windows o Mac).

Nuklear si scosta completamente come stile e quindi non pretende di mockare un tema (se ci pensi un po' come fanno programmi come Photoshop alla fine)
 
  • Mi piace
Reazioni: Andretti60

pabloski

Utente Èlite
2,868
916
Mmmm il vantaggio di Qt è che si adatta agli engine che stanno sotto (WinForms, GTK, etc). Gli svantaggi sono quelli che hai descritto.

Qt però non è solo GUI ma offre threading, networking, supporto a vari formati immagine, ecc... e soprattutto un'architettura, la Model-View. Comunque ho fatto un esperimento e un hello world linkato staticamente ( compresa la libc però ) genera un eseguibile di 20 MB. A seconda del caso d'uso potrebbero non essere un problema.

Riguardo la licenza faccio notare che puoi benissimo creare un programma closed source utilizzando la versione lgpl di Qt. Basta non linkare staticamente. La licenza è obbligatoria se produci un eseguibile linkato staticamente con Qt.

Infine, se davvero vuoi discostarti dalle tecniche tradizionali, dai un'occhiata a Sciter https://github.com/sciter-sdk/go-sciter

Sciter è quello che avrebbe dovuto essere Electron, invece di essere il mostro disumano che è.
 
  • Mi piace
Reazioni: Giacomo Furlan

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Infatti, quello che non mi piace di Qt è che aggiunge tutto un layer (per l'amor del cielo, utile a molti) che rende il suo codice "highly opinionated". Ricordo ai tempi di sviluppi su Windows o Android era molto semplice (di base): un editor di GUI con i bei widget salvati in un file XML (o simile), ai quali si interagisce tramite dei semplici binding.

Non esiste nulla di simile per go?
 

pabloski

Utente Èlite
2,868
916
Non esiste nulla di simile per go?

Si ma è QML, quindi Qt :D

Comunque considera che molte di queste ormai non sono librerie per UI ma framework. Qt va paragonato a .Net non a Nuklear o Fltk e nemmeno a GTK+.

Per Go hai relativamente poche possibilità: Qt, Gtk+, una manciata di librerie per cui esistono binding, l'uso combinato con Electron e quindi HTML/CSS/JS, l'uso di una webview che poi è simile all'uso di Electron e Sciter.

C'è pure qualcosa di nativo tipo Andlabs e un paio d'altri, ma sono tutt'altro che completi.

C'è un binding per IUP che ti dà lo stesso di Nuklear ma con look&feel nativo https://github.com/jcowgar/go-iup

Se parliamo di sviluppo a la XAML, coi file XML, ecc... la strada è quella di un qualcosa web-based, quindi Electron o Sciter o QML. Il secondo è ovviamente migliore perchè ti consente di rilasciare un singolo eseguibile ed è una libreria da un paio di mega.
 
  • Mi piace
Reazioni: Giacomo Furlan

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
Ho (intra)visto QML e mi sembrava quello che fa per me, ma subito dopo mi sono reso conto che in QML vai a definire anche il comportamento in stile ECMAScript. Si può forse limitarsi alla definizione della struttura, da gestire successivamente a livello programmatico?

P.S.
Ho visto anche dei video tutorial di introduzione proprio di QT del QML, ma secondo me sono fatti malissimo perché non spiegano quello che stanno facendo, ma lo fanno e basta... e non ho trovato per ora nessuna guida scritta che descriva il funzionamento ed il comportamento... Esiste una cosa del genere sul web?
 

pabloski

Utente Èlite
2,868
916
Ho (intra)visto QML e mi sembrava quello che fa per me, ma subito dopo mi sono reso conto che in QML vai a definire anche il comportamento in stile ECMAScript. Si può forse limitarsi alla definizione della struttura, da gestire successivamente a livello programmatico?

C'è chi usa ECMAScript per implementare pure la logica di business ( o parti di essa ). Inutile dire che le raccomandazioni ufficiali sconsigliano vivamente tale pratica. La logica va implementata nel linguaggio scelto, che sia C++, Python o altro. Gli script QML al massimo possono essere usati per implementare effetti sui widget.


Ho visto anche dei video tutorial di introduzione proprio di QT del QML, ma secondo me sono fatti malissimo perché non spiegano quello che stanno facendo, ma lo fanno e basta... e non ho trovato per ora nessuna guida scritta che descriva il funzionamento ed il comportamento... Esiste una cosa del genere sul web?

Qt soffre di una carenza di risorse valide in effetti. Comunque c'è un libro ufficiale per QML https://qmlbook.github.io/

La restante parte la fa la documentazione ufficiale http://doc.qt.io/qt-5/qtqml-index.html
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!