Der Go-Qt-Spicker

Aus archium.org
Wechseln zu: Navigation, Suche


zurück

Go und das Qt-Application Framework

Gegenwärtig ist QT das am besten und vollständigsten von Go unterstütze Windows-Toolkit. Es ist auch für Windows, Mac, Raspberry Pi, Ubuntu Touch-Smartphones und Android verfügbar! Die Handhabung ist relativ einfach und erfordert weniger Code-Zeilen als z.B. GTK. Der Speicherbedarf ist jedoch höher als bei GTK.

Installation

Siehe https://github.com/therecipe/qt

Variante 1: Ausschließlich Go-Code

package main

import (
	"os"

	"github.com/therecipe/qt/widgets"
)

func main() {
	//1. Eröffne eine neue Applikation (also eine Sammlung von Widgets)
	widgets.NewQApplication(len(os.Args), os.Args) // ... übergebe Kommandozeilenparameter (ansonsten "nil")

	//2. Erzeuge das Haupt-Fenster
	window := widgets.NewQMainWindow(nil, 0)
	window.SetWindowTitle("Titel des Hauptfensters")
	window.SetMinimumSize2(400, 100)

	//3. Erzeuge ein Layout ⇒ https://doc.qt.io/qt-5/qlayout.html
	layout := widgets.NewQHBoxLayout()

	//4. Erzeuge ein Widget und weise dem Widget ein Layout zu
	widget := widgets.NewQWidget(nil, 0)
	widget.SetLayout(layout)

	//5-1. Erzeuge eine Eingabezeile
	input := widgets.NewQLineEdit(nil)
	input.SetPlaceholderText("Schreib mal wieder!")

	//5-2. Erzeuge einen Knopf
	button := widgets.NewQPushButton2("Hier klicken", nil)
	button.ConnectClicked(func(checked bool) {
		//6. Weise dem Knopf ein Signal zu, das beim Drücken des Knopfes eine
		//   Funktion ausführen soll
		widgets.QMessageBox_Information(nil, "Titel des Infofensters", input.Text(), widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
	})

	//7.  Weise die Input-Widges dem Layout zu
	layout.AddWidget(input, 0, 0)  // ⇒ http://doc.qt.io/qt-5/qboxlayout.html#addWidget
	layout.AddWidget(button, 0, 0) // ⇒ https://doc.qt.io/qt-5/qboxlayout.html#addWidget

	//8. Dem Haupt-Fenster muß ein Haupt-Widget zugewiesen werden
	window.SetCentralWidget(widget)

	//9. Zeichne das Haupt-Fenster
	window.Show()

	//9. Damit die Applikation dynamisch auf Benutzereingaben/Events reagieren
	//   kann, muß sie in einer Endlosschleife laufen
	widgets.QApplication_Exec()
}

Variante 2: Mit Einbettung von QML-Code bzw. UI-Files

funktioniert nicht in den neuesten Go-Versionen

Teil 1: Go-Code

package main

import (
	"os"

	"github.com/therecipe/qt/core"
	"github.com/therecipe/qt/uitools"
	"github.com/therecipe/qt/widgets"
)

func main() {
	//1. Eröffne eine neue Applikation (als eine Sammlung von Widgets)
	widgets.NewQApplication(len(os.Args), os.Args) // ... übergebe Kommandozeilenparameter (ansonsten "nil")

	//2. Erzeuge ein Widget
	var widget = widgets.NewQWidget(nil, 0)

	//3. Lade UI-Datei und erzeuge damit indirekt
	//   auch das Haupt-Fenster.
	var loader = uitools.NewQUiLoader(nil)
	var file = core.NewQFile2("./qml/meinFormular.ui")
	file.Open(core.QIODevice__ReadOnly)
	var formWidget *widgets.QWidget = loader.Load(file, widget)
	file.Close()

	//4. Erzeuge Input-Widgets aus QML-Datei
	var (
		ui_textinputEingabefeld = widgets.NewQTextEditFromPointer(widget.FindChild("textinputEingabefeld", core.Qt__FindChildrenRecursively).Pointer())
		ui_buttonAusloeser      = widgets.NewQPushButtonFromPointer(widget.FindChild("buttonAusloeser", core.Qt__FindChildrenRecursively).Pointer())
	)

	//5. Weise dem Knopf ein Signal zu, das beim Drücken eine Funktion ausführen soll
	ui_buttonAusloeser.ConnectClicked(func(checked bool) {
		widgets.QMessageBox_Information(nil, "Titel des Infofensters", ui_textinputEingabefeld.ToPlainText(), widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
	})

	//6. Erzeuge ein Layout und weise es dem Widget zu
	var layout = widgets.NewQVBoxLayout()

	//8. Weise dem Widget ein Layout zu und weise dem Layout die Input-Widges zu
	widget.SetLayout(layout)
	layout.AddWidget(formWidget, 0, 0)

	//9. Ändere Attribute, falls nötig
	widget.SetWindowTitle("Titel des Hauptfensters Nr. 2")

	//10. Zeichne das Haupt-Fenster
	widget.Show()

	//11. Damit die Applikation dynamisch auf Benutzereingaben/Events reagieren
	//   kann, muß sie in einer Endlosschleife laufen
	widgets.QApplication_Exec()
}

Teil 2: QML-Code (Qt Meta-object Language)

Die Gestaltung mit dem Qt-Designer …

QtDesignerExample.png

… erzeugt ein UI-File

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>meinFormular</class>
 <widget class="QWidget" name="meinFormular">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>100</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="windowTitle">
   <string>Titel des Hauptfensters</string>
  </property>
  <layout class="QGridLayout">
   <property name="leftMargin">
    <number>9</number>
   </property>
   <property name="topMargin">
    <number>9</number>
   </property>
   <property name="rightMargin">
    <number>9</number>
   </property>
   <property name="bottomMargin">
    <number>9</number>
   </property>
   <property name="spacing">
    <number>6</number>
   </property>
   <item row="1" column="2">
    <widget class="QPushButton" name="buttonAusloeser">
     <property name="text">
      <string>Hier klicken!</string>
     </property>
     <property name="flat">
      <bool>false</bool>
     </property>
    </widget>
   </item>
   <item row="1" column="3">
    <spacer name="horizontalSpacer_4">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>40</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="1">
    <widget class="QPlainTextEdit" name="textinputEingabefeld">
     <property name="placeholderText">
      <string>Schreib mal wieder!</string>
     </property>
    </widget>
   </item>
   <item row="1" column="0">
    <spacer name="horizontalSpacer_3">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>40</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="2" column="1">
    <spacer name="verticalSpacer_1">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>20</width>
       <height>40</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="0" column="1">
    <spacer name="verticalSpacer_2">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>20</width>
       <height>40</height>
      </size>
     </property>
    </spacer>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

Links