Update attempts

This commit is contained in:
Daniel Ziltener 2022-03-03 12:04:30 +01:00
parent 76b4fb9915
commit 3deeedff95
3 changed files with 375 additions and 137 deletions

190
examples/examples.org Normal file
View File

@ -0,0 +1,190 @@
#+TITLE: QML Examples
* Hello World
This is a simple "Hello World" program, opening a window and displaying a text.
#+begin_src javascript :tangle helloworld.qml
import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
Window {
id: window
visible: true
width: 800
height: 600
Rectangle {
color: "lightgray"
width: 800
height: 600
x: 0
y: 0
Text {
text: qt("Hello World!")
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
font.pointSize: 24
font.bold: true
}
}
}
#+end_src
#+begin_src scheme :tangle helloworld.scm
(import (chicken base)
srfi-18
(qml core)
coops)
(gui-application-create)
(define engine (make <QQmlApplicationEngine>))
(load-url engine (new-QUrl "helloworld.qml"))
(do ((loop #t))
((not loop) #t)
(thread-sleep! (seconds->time (+ 0.05 (time->seconds (current-time)))))
(process-events-timed (qevent-loop-process-event-flag process-all-events:) 50))
#+end_src
* Signals and Slots
Adapted from https://raymii.org/s/snippets/Cpp_QT_QML_Signals_and_Slots.html
#+begin_src javascript :tangle signals-slots.qml
import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.Controls 2.11
Window {
width: 640
height: 480
visible: true
title: qsTr("QML Signals and slots example - Raymii.org")
MenuBar {
width: parent.width
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
Column {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
spacing: 20
Text {
id: info
width: parent.width * 0.9
wrapMode: Text.WordWrap
text: "QML / C++ binding via signals and slots example program, by Raymii.org. License: GNU GPLv3"
}
Text {
id: labelCount
// C++ method Counter::value(). Bound via Q_PROPERTY, updates automatically on change
text: "Counter: " + MyCounter.value + "."
}
Text {
property int changeCount: 0
id: labelChanged
text: "Count has changed " + changeCount + " times."
// Receive the valueChanged NOTIFY
Connections {
target: MyCounter
onValueChanged: {
++labelChanged.changeCount
}
}
}
Row {
spacing: 20
Button {
text: qsTr("Increase Counter")
onClicked: ++MyCounter.value
}
Button {
text: qsTr("Set counter to 10")
// C++ method Counter::setValue(long long), bound via Q_PROPERTY
onClicked: MyCounter.setValue(10)
}
Button {
text: qsTr("Reset")
onClicked: {
// C++ method Counter::setValue(long long), bound via Q_PROPERTY
MyCounter.setValue(0)
}
}
}
Row {
spacing: 20
Text {
id: setText
text: qsTr("Enter counter value: ")
}
Rectangle {
width: setText.width
height: setText.height
border.width: 1
border.color: "black"
TextInput {
id: counterInput
focus: true
text: MyCounter.value
}
}
// Bi-directional binding, entering a number in the textarea updates the
// C++ class, if the C++ class is updated, the textarea is updated as well.
Binding {
target: MyCounter
property: "value"
value: counterInput.text
}
}
}
}
#+end_src
#+begin_src scheme :tangle signals-slots.scm
(import (chicken base)
srfi-18
(qml core)
coops
coops-primitive-objects)
(gui-application-create)
(define engine (make <QQmlApplicationEngine>))
;; Create counter object
(define (callback self slotName argv)
(print self " == " slotName " == " argv))
;; See https://doc.qt.io/qt-5/qmetatype.html for the meta types
(define counter (make-QObject #f "Counter" #f callback
(new-Signals (list (new-Signal "valueChanged" '(int))))
(new-Slots (list (new-Slot "setValue" 43 '(int))
(new-Slot "value" 2 '(void))))
(new-Properties (list (new-Property "value" 2 "value" "setValue" "valueChanged")))))
(set-property root-context "MyCounter" counter)
(load engine (new-QUrl "signals-slots.qml"))
(do ((loop #t))
((not loop) #t)
(thread-sleep! (seconds->time (+ 0.05 (time->seconds (current-time)))))
(process-events-timed (qevent-loop-process-event-flag process-all-events:) 50))
#+end_src

View File

@ -379,6 +379,29 @@
(define-method (delete-pointer (qv <QVariant>))
(dos_qvariant_delete (ptr qv)))
(define dobject-callbacks (make-hash-table))
(define-external (dObjectCallbackHelper (c-pointer self) (c-pointer slotName) (int argc) ((c-pointer c-pointer) argv)) void
(let* ((qobject (hash-table-ref dobject-callbacks self))
(args (c_array_convert argv argc)))
((alist-ref callback: dobject-callbacks) (alist-ref object: dobject-callbacks) (qvariant slotName)
(map qvariant args))))
(define (make-QObject qobject name qmetaobject signals slots props callback)
@("Creates a new QObject."
(qobject "An instance of <QObject> or #f")
(qmetaobject "A QMetaObject or #f")
(callback "A procedure of the form (function <QObject> self <QVariant> slotName <QVariant>-array argv)"))
(let* ((qmeta (if qmetaobject (ptr qmetaobject) (dos_qobject_qmetaobject)))
(qmeta (dos_qmetaobject_create (qml_qmetaobject_superClass)
name signals slots props))
(qobj (make <QObject> 'ptr (dos_qobject_create (if (instance-of? qobject <QObject>)
(ptr qobject) #f)
qmeta
callback))))
(hash-table-set! dobject-callbacks (ptr qobj) `((object: . ,qobj)
(callback: . ,callback)))
qobj))
(define-method (signal-emit (qo <QObject>) (name <string>) (paramcount <integer>) (parameters <sequence>))
(dos_qobject_signal_emit (ptr qo) name paramcount parameters))
(define-method (object-name (qo <QObject>))
@ -481,17 +504,29 @@
;; - Signals
(define-class <SignalDefinition> (<SchemeObject>))
(define-method (new-Signal (name <string>) (parameters <list>))
(make <SignalDefinition> 'obj (dos_signaldefinition_create name (length parameters) (map obj parameters))))
(define-method (new-Signal (name <string>) #!rest parameters)
(make <SignalDefinition>
'obj (dos_signaldefinition_create name (length parameters)
(cdr
(foldl (lambda (coll elem)
(cons (+ (car coll) 1)
(pointer-vector-set! (cdr coll) (car coll)
(object->pointer (object-evict (obj elem))))))
(cons 0 (make-pointer-vector (length parameters))) parameters)))))
(define-class <SignalDefinitions> (<QMLBase>))
(define-method (new-Signals (defs <list>))
(make <SignalDefinitions> 'ptr (dos_signaldefinitions_create (length defs) (map ptr defs))))
(make <SignalDefinitions>
'ptr (dos_signaldefinitions_create (length defs)
(foldl (lambda (coll elem)
(cons (+ (car coll) 1)
(pointer-vector-set! (cdr coll) (car coll) (ptr elem))))
(cons 0 (make-pointer-vector (length defs))) defs))))
(define-method (delete-pointer (sd <SignalDefinitions>))
(dos_signaldefinitions_delete (ptr sd)))
;; - Slots
(define-class <SlotDefinition> (<SchemeObject>))
(define-method (new-Slot (name <string>) (returnMetaType <integer>) (parameters <list>))
(define-method (new-Slot (name <string>) (returnMetaType <integer>) #!rest parameters)
(make <SlotDefinition> 'obj (dos_slotdefinition_create name returnMetaType (length parameters) (map obj parameters))))
(define-class <SlotDefinitions> (<QMLBase>))
(define-method (new-Slots (defs <list>))
@ -514,6 +549,8 @@
(dos_qqmlcontext_baseUrl (ptr context)))
(define-method (set-property (context <QQmlContext>) (name <string>) (qvalue <QVariant>))
(dos_qqmlcontext_setcontextproperty (ptr context) name (ptr qvalue)))
(define-method (set-property (context <QQmlContext>) (name <string>) (qvalue <QObject>))
(qml_qqmlcontext_setcontextproperty (ptr context) name (ptr qvalue)))
(define-class <QUrl> (<QMLBase>))
(define (new-QUrl url)

View File

@ -46,6 +46,7 @@
dos_qapplication_delete
dos_qquickstyle_set_style
dos_qquickstyle_set_fallback_style
dos_qobject_create
dos_qobject_signal_emit
dos_qobject_objectName
dos_qobject_setObjectName
@ -81,6 +82,7 @@
dos_qvariant_delete
dos_qqmlcontext_baseUrl
dos_qqmlcontext_setcontextproperty
qml_qqmlcontext_setcontextproperty
dos_qurl_create
dos_qurl_to_string
dos_qurl_isValid
@ -114,6 +116,7 @@
dos_qquickview_rootContext
dos_qquickview_delete
dos_qmetaobject_create
qml_qmetaobject_superClass
dos_qmetaobject_invoke_method
dos_qmetaobject_delete
dos_qmetaobject_connection_delete
@ -540,6 +543,11 @@
(c-string name)
((c-pointer DosQVariant) value))
"dos_qqmlcontext_setcontextproperty(vptr, name, value);"))
(define qml_qqmlcontext_setcontextproperty
(foreign-lambda* void (((c-pointer DosQQmlContext) vptr)
(c-string name)
((c-pointer DosQObject) value))
"dos_qqmlcontext_setcontextproperty(vptr, name, value);"))
;; String
(define dos_chararray_delete
@ -676,6 +684,9 @@
((c-pointer SlotDefinitions) slotDefinitions)
((c-pointer PropertyDefinitions) propertyDefinitions))
"C_return(dos_qmetaobject_create(superClassMetaObject, className, signalDefinitions, slotDefinitions, propertyDefinitions));"))
(define qml_qmetaobject_superClass
(foreign-lambda* (c-pointer DosQMetaObject) (((c-pointer DosQMetaObject) qMetaObject))
"C_return((DosQMetaObject*)((QMetaObject*)qMetaObject)->superClass());"))
(define dos_qmetaobject_delete
(foreign-lambda* void (((c-pointer DosQMetaObject) vptr))
"dos_qmetaobject_delete(vptr);"))