golang qt中的自定义Object

这篇文章主要记录golang qt使用中的自定义Object怎么编写以及singal使用

  • wk.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package wk

import (
"fmt"
"sync"

"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/network"
"github.com/therecipe/qt/webkit"
)

// ScreenshotConfig screenshot config
type ScreenshotConfig struct {
ID string
URL string
Width int
Height int
Quality int
Format string
UA string
}

// ScreenshotObject qt object
type ScreenshotObject struct {
core.QObject

_ func(config ScreenshotConfig) `signal:"startScreenshot,auto"`
_ func(id string, data []byte) `signal:"finishScreenshot,auto"`

Map sync.Map
}

// StartScreenshot start screenshot slots
func (s *ScreenshotObject) startScreenshot(config ScreenshotConfig) {
s.GetScreenshot(config)
}

// FinishScreenshot finish screenshot slots and store data to map
func (s *ScreenshotObject) finishScreenshot(id string, data []byte) {
s.Map.Store(id, data)
}

// GetScreenshot get a snapshot for website
func (s *ScreenshotObject) GetScreenshot(config ScreenshotConfig) {
...
page.MainFrame().Load(qURL)

page.ConnectLoadFinished(func(bool) {
...
s.FinishScreenshot(config.ID, data)
fmt.Println(data)
})
}

  • main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
"os"

"github.com/akkuman/webkit-screenshot/wk"
"github.com/therecipe/qt/widgets"
)

func main() {
os.Setenv("QT_QPA_PLATFORM", "offscreen")

app := widgets.NewQApplication(len(os.Args), os.Args)
screenshotObj := wk.NewScreenshotObject(nil)

go screenshot(screenshotObj, "https://www.baidu.com")

app.Exec()
}

func screenshot(obj *wk.ScreenshotObject, url string) {
config := wk.ScreenshotConfig{
ID: "xxxx",
URL: url,
Width: 1920,
Height: 1080,
Quality: 50,
Format: "jpg",
UA: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
}
obj.StartScreenshot(config)
}

看到上面两段代码截取,golang qt里面使用 Connect[singalName] 连接 singal,在struct tag中加上auto代表可以把该结构体方法同名的方法自动Connect上去。

这里需要注意一点,auto 的方法名不要首字母大写,会与 qtmoc 自动生成的有冲突。

该程序的目的是需要在外部通过 goroutine 调用组件进行一系列方法。

这里需要十分注意的一点是,qt 组件必须在 qt 程序主消息循环中创建,不能在 goroutine 中创建,否则样例中的 page.ConnectLoadFinished 将不会被执行。

拿这个例子来说,就是 screenshotObj := wk.NewScreenshotObject(nil) 必须在主线程中,而不能用 goroutine 执行。

Author

Akkuman

Posted on

2020-12-23

Updated on

2021-07-20

Licensed under

Comments