|
@@ -10,7 +10,11 @@ import "C"
|
|
|
import (
|
|
|
"io/ioutil"
|
|
|
"runtime"
|
|
|
+ "reflect"
|
|
|
"unsafe"
|
|
|
+ "fmt"
|
|
|
+ "math/rand"
|
|
|
+ "kumachan/qt/cgohelper"
|
|
|
)
|
|
|
|
|
|
|
|
@@ -18,27 +22,50 @@ func main() {
|
|
|
runtime.LockOSThread()
|
|
|
C.QtInit()
|
|
|
(func() {
|
|
|
+ var new_str, del_all_str = str_alloc()
|
|
|
+ defer del_all_str()
|
|
|
var ui_bytes, err = ioutil.ReadFile("example.ui")
|
|
|
if err != nil { panic(err) }
|
|
|
var ui_str = string(ui_bytes)
|
|
|
- var ui_c_str *C.char = C.CString(ui_str)
|
|
|
- defer C.free(unsafe.Pointer(ui_c_str))
|
|
|
- var w = C.QtLoadWidget(ui_c_str)
|
|
|
+ var w = C.QtLoadWidget(new_str(ui_str))
|
|
|
if w == nil { panic("failed to load widget") }
|
|
|
C.QtWidgetShow(w)
|
|
|
- var label_name *C.char = C.CString("label")
|
|
|
- defer C.free(unsafe.Pointer(label_name))
|
|
|
- var label = C.QtWidgetFindChild(w, label_name)
|
|
|
+ var label = C.QtWidgetFindChild(w, new_str("label"))
|
|
|
if label == nil { panic("unable to find label") }
|
|
|
- var prop_text *C.char = C.CString("text")
|
|
|
- defer C.free(unsafe.Pointer(prop_text))
|
|
|
- var buf [100]rune
|
|
|
- var text_content = []rune("你好世界")
|
|
|
- copy(buf[:], text_content)
|
|
|
- var text = C.QtNewStringUTF32((*C.uint32_t)(unsafe.Pointer(&buf)), (C.size_t)(uint(len(text_content))))
|
|
|
- defer C.QtDeleteString(text)
|
|
|
- C.QtObjectSetPropString(label, prop_text, text)
|
|
|
+ var text, del_text = NewStringFromRunes([]rune("你好世界"))
|
|
|
+ defer del_text()
|
|
|
+ C.QtObjectSetPropString(label, new_str("text"), text)
|
|
|
+ var cb = cgohelper.RegisterCallback(func() {
|
|
|
+ var new_str, del_all_str = str_alloc()
|
|
|
+ defer del_all_str()
|
|
|
+ var x, del_x = NewStringFromRunes([]rune(fmt.Sprint(rand.Float64())))
|
|
|
+ defer del_x()
|
|
|
+ C.QtObjectSetPropString(label, new_str("text"), x)
|
|
|
+ })
|
|
|
+ var btn = C.QtWidgetFindChild(w, new_str("button"))
|
|
|
+ if btn == nil { panic("unable to find button") }
|
|
|
+ C.QtConnect(btn, new_str("clicked()"), cgo_callback, C.size_t(cb))
|
|
|
})()
|
|
|
C.QtMainLoop()
|
|
|
}
|
|
|
|
|
|
+func NewStringFromBuf(buf ([] uint32)) (C.QtString, func()) {
|
|
|
+ var slice = *(*reflect.SliceHeader)(unsafe.Pointer(&buf))
|
|
|
+ var ptr = (*C.uint32_t)(unsafe.Pointer(slice.Data))
|
|
|
+ var size = (C.size_t)(slice.Len)
|
|
|
+ var str = C.QtNewStringUTF32(ptr, size)
|
|
|
+ return str, func() {
|
|
|
+ C.QtDeleteString(str)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func NewStringFromRunes(runes ([] rune)) (C.QtString, func()) {
|
|
|
+ var slice = *(*reflect.SliceHeader)(unsafe.Pointer(&runes))
|
|
|
+ var ptr = (*C.uint32_t)(unsafe.Pointer(slice.Data))
|
|
|
+ var size = (C.size_t)(slice.Len)
|
|
|
+ var str = C.QtNewStringUTF32(ptr, size)
|
|
|
+ return str, func() {
|
|
|
+ C.QtDeleteString(str)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|