├── .gitignore
├── LICENSE
├── README.md
├── button
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_17-57.png
│ └── app.ico
└── main.go
├── calendar_widget
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── check_box
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_12-40.png
│ ├── 2023-08-06_12-40_1.png
│ └── app.ico
└── main.go
├── close_window
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── close_window_button_event
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── color_dialog
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_11-21.png
│ ├── 2023-08-06_11-21_1.png
│ └── app.ico
└── main.go
├── combo_box
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_14-18.png
│ └── app.ico
└── main.go
├── custom_key_press_event
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_17-57.png
│ └── app.ico
└── main.go
├── custom_signal
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_17-54.png
│ └── app.ico
└── main.go
├── custom_signal_mouse_move_event
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_17-54.png
│ └── app.ico
└── main.go
├── docs
├── Qt环境安装.md
├── goqtuic工具.md
└── 交叉编译文档.md
├── empty_window
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_17-54.png
│ └── app.ico
└── main.go
├── file_dialog
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_12-25.png
│ ├── 2023-08-06_12-25_1.png
│ └── app.ico
└── main.go
├── file_dialog_by_dir
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_12-23.png
│ ├── 2023-08-06_12-23_1.png
│ └── app.ico
└── main.go
├── font_dialog
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
└── main.go
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── gosignal
├── README.md
├── go.mod
├── go.sum
└── lib.go
├── input_dialog
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
└── main.go
├── layout_absolute_position
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── layout_grid_layout
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── layout_grid_layout_comment
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── layout_hbox_layout
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── layout_vbox_and_hbox_layout
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── layout_vbox_layout
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-08.png
│ └── app.ico
└── main.go
├── line_edit
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── menubar
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_color
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_draw_point
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_pen
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_text1
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_text2
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_text3
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_text4
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── painter_text5
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── password_input_dialog
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
└── main.go
├── pixmap
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ ├── app.ico
│ └── landscape.png
└── main.go
├── progress_bar
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── qt_oop_struct
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── screen_center
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_17-55.png
│ └── app.ico
└── main.go
├── signal_slot
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_17-57.png
│ └── app.ico
└── main.go
├── simple_drag
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── simple_drag_button
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── slider
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_13-36.png
│ ├── app.ico
│ ├── audio-high.png
│ ├── audio-low.png
│ ├── audio-mid.png
│ └── audio.png
└── main.go
├── splitter
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── statusbar
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── tip
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── toggle_button
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-06_13-00.png
│ └── app.ico
└── main.go
├── toolbar
├── README.md
├── go.mod
├── go.sum
├── images
│ ├── 2023-08-05_18-10.png
│ └── app.ico
└── main.go
├── toolbar_and_statusbar
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
└── main.go
├── ui_loader
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
├── main.go
└── untitled.ui
├── widget_sender_receiver
├── README.md
├── go.mod
├── go.sum
├── images
│ └── app.ico
└── main.go
└── widget_sender_receiver2
├── README.md
├── go.mod
├── go.sum
├── images
├── 2023-08-05_17-57.png
└── app.ico
└── main.go
/.gitignore:
--------------------------------------------------------------------------------
1 | vendor
2 | qtbox
3 | */qtbox
4 | **/qtbox
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 silent rain
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/button/README.md:
--------------------------------------------------------------------------------
1 | # 按钮
2 | 在窗口中添加一个按钮,点击后终端打印文本。
3 |
4 | ## 效果展示
5 | 
6 |
7 |
--------------------------------------------------------------------------------
/button/go.mod:
--------------------------------------------------------------------------------
1 | module button
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/button/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/button/images/2023-08-05_17-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/button/images/2023-08-05_17-57.png
--------------------------------------------------------------------------------
/button/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/button/images/app.ico
--------------------------------------------------------------------------------
/button/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 添加一个按钮
43 | // btn := widgets.NewQPushButton(app)
44 | // 设置按钮内容
45 | //btn.SetText("关闭按钮")
46 | btn := widgets.NewQPushButton2("关闭按钮", app)
47 | // 设置按钮大小
48 | // btn.SizeHint() 显示默认尺寸
49 | btn.Resize(btn.SizeHint())
50 | // 设置按钮位置
51 | btn.Move2(50, 50)
52 | // 设置按钮触发,触发退出程序
53 | btn.ConnectClicked(func(checked bool) {
54 | fmt.Println("点击按钮")
55 | })
56 |
57 | btn.Show()
58 | }
59 |
60 | func main() {
61 | // 创建一个应用程序对象
62 | // sys.argv参数是一个列表,从命令行输入参数
63 | widgets.NewQApplication(len(os.Args), os.Args)
64 |
65 | // 初始化主窗口
66 | app := InitMainWindow()
67 |
68 | // 初始化组件
69 | InitComponents(app)
70 |
71 | // 控制窗口显示在屏幕中心的方法
72 | center(app)
73 |
74 | // 显示主窗口
75 | app.Show()
76 |
77 | // 确保应用程序干净的退出
78 | widgets.QApplication_Exec()
79 | }
80 |
--------------------------------------------------------------------------------
/calendar_widget/README.md:
--------------------------------------------------------------------------------
1 | # 日历控件QCalendarWidget
2 | - QCalendarWidget提供了一个基于月份的日历控件。
3 | - 它使用户以一种简单直观的方式来选择日期。
4 | - 示例中创建了一个日历控件和一个标签控件。选择的日期会显示在标签控件中。
5 |
6 |
7 |
8 | ## 效果展示
9 | 
10 |
11 |
--------------------------------------------------------------------------------
/calendar_widget/go.mod:
--------------------------------------------------------------------------------
1 | module calendar_widget
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/calendar_widget/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/calendar_widget/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/calendar_widget/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/calendar_widget/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/calendar_widget/images/app.ico
--------------------------------------------------------------------------------
/calendar_widget/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | // 日历控件
48 | cal := widgets.NewQCalendarWidget(widget)
49 | cal.SetGridVisible(true)
50 |
51 | // 默认当前日期
52 | date := cal.SelectedDate()
53 |
54 | lbl := widgets.NewQLabel(widget, core.Qt__Widget)
55 | lbl.SetText(date.ToString("yyyy年MM月dd日"))
56 |
57 | lbl.Move2(130, 20)
58 | cal.Move2(20, 40)
59 |
60 | // 我们检索所选日期通过调用selectedDate()方法。
61 | //然后我们将date对象转换为字符串,并将其设置为小部件的标签。
62 | cal.ConnectClicked(func(date *core.QDate) {
63 | lbl.SetText(date.ToString("yyyy年MM月dd日"))
64 | })
65 | }
66 |
67 | func main() {
68 | // 创建一个应用程序对象
69 | // sys.argv参数是一个列表,从命令行输入参数
70 | widgets.NewQApplication(len(os.Args), os.Args)
71 |
72 | // 初始化主窗口
73 | app := InitMainWindow()
74 |
75 | // 初始化组件
76 | InitComponents(app)
77 |
78 | // 控制窗口显示在屏幕中心的方法
79 | center(app)
80 |
81 | // 显示主窗口
82 | app.Show()
83 |
84 | // 确保应用程序干净的退出
85 | widgets.QApplication_Exec()
86 | }
87 |
--------------------------------------------------------------------------------
/check_box/README.md:
--------------------------------------------------------------------------------
1 | # 复选框控件QCheckBox
2 | - QCheckBox复选框控件,它有两个状态:打开和关闭,他是一个带有文本标签(Label)的控件。
3 | - 复选框常用于表示程序中可以启用或禁用的功能。
4 | - 在我们的示例中,我们将创建一个复选框,将切换窗口标题。
5 |
6 |
7 | ## 控件介绍
8 | - 控件是构建应用程序的基本模块,Qt5提供各种各样的控件;
9 | - 包括按钮、复选框、滑动条、列表框等;
10 | - 常用的控件:
11 | - QCheckBox,ToggleButton,QSlider,QProgressBar,QCalendarWidget
12 | - QPixmap、QLineEdit QSplitter,QComboBox
13 |
14 | ## 效果展示
15 | 
16 | 
--------------------------------------------------------------------------------
/check_box/go.mod:
--------------------------------------------------------------------------------
1 | module check_box
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/check_box/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/check_box/images/2023-08-06_12-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/check_box/images/2023-08-06_12-40.png
--------------------------------------------------------------------------------
/check_box/images/2023-08-06_12-40_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/check_box/images/2023-08-06_12-40_1.png
--------------------------------------------------------------------------------
/check_box/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/check_box/images/app.ico
--------------------------------------------------------------------------------
/check_box/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | //widget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
45 | widget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(widget)
47 |
48 | // 复选框组件
49 | cb := widgets.NewQCheckBox2("Show title", widget)
50 | cb.Move2(20, 20)
51 | // 我们有设置窗口标题,所以我们也必须检查复选框。
52 | //默认情况下,没有设置窗口标题和也没有勾选复选框。
53 | cb.Toggle()
54 | // 这个方法会切换窗体的标题。
55 | //复选框的状态经由state参数传入方法。
56 | //在勾选复选框时设置窗体标题,取消勾选时就将标题设为空字符串。
57 | cb.ConnectStateChanged(func(state int) {
58 | //fmt.Println(reflect.TypeOf(state), state)
59 | if state == int(core.Qt__Checked) {
60 | app.SetWindowTitle("QCheckBox")
61 | } else {
62 | app.SetWindowTitle(" ")
63 | }
64 | })
65 | }
66 |
67 | func main() {
68 | // 创建一个应用程序对象
69 | // sys.argv参数是一个列表,从命令行输入参数
70 | widgets.NewQApplication(len(os.Args), os.Args)
71 |
72 | // 初始化主窗口
73 | app := InitMainWindow()
74 |
75 | // 初始化组件
76 | InitComponents(app)
77 |
78 | // 控制窗口显示在屏幕中心的方法
79 | center(app)
80 |
81 | // 显示主窗口
82 | app.Show()
83 |
84 | // 确保应用程序干净的退出
85 | widgets.QApplication_Exec()
86 | }
87 |
--------------------------------------------------------------------------------
/close_window/README.md:
--------------------------------------------------------------------------------
1 | # 关闭窗口
2 | 点击主窗口中的按钮来关闭窗口。
3 |
4 |
5 | ## 效果展示
6 | 
7 |
8 |
--------------------------------------------------------------------------------
/close_window/go.mod:
--------------------------------------------------------------------------------
1 | module close_window
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/close_window/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/close_window/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/close_window/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/close_window/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/close_window/images/app.ico
--------------------------------------------------------------------------------
/close_window/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 添加一个按钮
43 | // btn := widgets.NewQPushButton(app)
44 | // 设置按钮内容
45 | //btn.SetText("关闭按钮")
46 | btn := widgets.NewQPushButton2("关闭按钮", app)
47 | // 设置按钮大小
48 | // btn.SizeHint() 显示默认尺寸
49 | btn.Resize(btn.SizeHint())
50 | // 设置按钮位置
51 | btn.Move2(50, 50)
52 | // 设置按钮触发,触发退出程序
53 | btn.ConnectClicked(func(checked bool) {
54 | fmt.Println("关闭窗口")
55 | app.Close()
56 | })
57 |
58 | btn.Show()
59 | }
60 |
61 | func main() {
62 | // 创建一个应用程序对象
63 | // sys.argv参数是一个列表,从命令行输入参数
64 | widgets.NewQApplication(len(os.Args), os.Args)
65 |
66 | // 初始化主窗口
67 | app := InitMainWindow()
68 |
69 | // 初始化组件
70 | InitComponents(app)
71 |
72 | // 控制窗口显示在屏幕中心的方法
73 | center(app)
74 |
75 | // 显示主窗口
76 | app.Show()
77 |
78 | // 确保应用程序干净的退出
79 | widgets.QApplication_Exec()
80 | }
81 |
--------------------------------------------------------------------------------
/close_window_button_event/README.md:
--------------------------------------------------------------------------------
1 | # 修改关闭窗口默认事件
2 | 修改程序默认关闭窗口事件,当关闭窗口时弹出对话框,确认则关闭,否则关闭对话框回到窗口。
3 |
4 |
5 | ## 效果展示
6 | 
7 |
8 |
--------------------------------------------------------------------------------
/close_window_button_event/go.mod:
--------------------------------------------------------------------------------
1 | module close_window_button_event
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/close_window_button_event/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/close_window_button_event/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/close_window_button_event/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/close_window_button_event/images/app.ico
--------------------------------------------------------------------------------
/close_window_button_event/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // CloseEvent 关闭事件
41 | func CloseEvent(event *gui.QCloseEvent) {
42 | reply := widgets.QMessageBox_Question(nil,
43 | "Message",
44 | "Are you sure to quit?",
45 | widgets.QMessageBox__Yes|widgets.QMessageBox__No,
46 | widgets.QMessageBox__Yes)
47 |
48 | if reply == widgets.QMessageBox__Yes {
49 | fmt.Println("退出")
50 | event.Accept()
51 | } else {
52 | fmt.Println("取消")
53 | event.Ignore()
54 | }
55 | }
56 |
57 | func main() {
58 | // 创建一个应用程序对象
59 | // sys.argv参数是一个列表,从命令行输入参数
60 | widgets.NewQApplication(len(os.Args), os.Args)
61 |
62 | // 初始化主窗口
63 | app := InitMainWindow()
64 |
65 | // 控制窗口显示在屏幕中心的方法
66 | center(app)
67 |
68 | // 修改默认关闭窗口事件
69 | app.ConnectCloseEvent(CloseEvent)
70 |
71 | // 显示主窗口
72 | app.Show()
73 |
74 | // 确保应用程序干净的退出
75 | widgets.QApplication_Exec()
76 | }
77 |
--------------------------------------------------------------------------------
/color_dialog/README.md:
--------------------------------------------------------------------------------
1 | # 颜色对话框QColorDialog
2 | - QColorDialog 显示一个用于选择颜色值的对话框。
3 | - 这个应用程序显示一个按钮和一个QFrame。
4 | - QFrame的背景为黑色。
5 | - 通过QColorDialog,我们可以改变它的背景。
6 |
7 |
8 |
9 | ## 效果展示
10 | 
11 | 
12 |
13 |
--------------------------------------------------------------------------------
/color_dialog/go.mod:
--------------------------------------------------------------------------------
1 | module color_dialog
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/color_dialog/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/color_dialog/images/2023-08-06_11-21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/color_dialog/images/2023-08-06_11-21.png
--------------------------------------------------------------------------------
/color_dialog/images/2023-08-06_11-21_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/color_dialog/images/2023-08-06_11-21_1.png
--------------------------------------------------------------------------------
/color_dialog/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/color_dialog/images/app.ico
--------------------------------------------------------------------------------
/color_dialog/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/core"
8 | "github.com/therecipe/qt/gui"
9 | "github.com/therecipe/qt/widgets"
10 | )
11 |
12 | // 控制窗口显示在屏幕中心的方法
13 | func center(app *widgets.QMainWindow) {
14 | // 获得窗口
15 | qr := app.FrameGeometry()
16 |
17 | // 获得屏幕中心点
18 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
19 | // 显示到屏幕中心
20 | qr.MoveCenter(cp)
21 | app.Move(qr.TopLeft())
22 | }
23 |
24 | // InitMainWindow 初始化主窗口
25 | func InitMainWindow() *widgets.QMainWindow {
26 | // 创建窗口
27 | app := widgets.NewQMainWindow(nil, 0)
28 |
29 | // 设置窗口的标题
30 | app.SetWindowTitle("Qt 教程")
31 |
32 | // 设置窗口的位置和大小
33 | app.SetGeometry2(300, 300, 300, 220)
34 |
35 | // 设置窗口的图标,引用当前目录下的web.png图片
36 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
37 |
38 | return app
39 | }
40 |
41 | // InitComponents 初始化组件
42 | func InitComponents(app *widgets.QMainWindow) {
43 | // 布局窗口组件载体
44 | widget := widgets.NewQWidget(app, core.Qt__Widget)
45 | //widget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
46 | widget.SetGeometry2(0, 0, 300, 220)
47 | app.SetCentralWidget(widget)
48 |
49 | // 初始化QFrame的颜色为黑色
50 | color := gui.NewQColor3(0, 0, 0, 0)
51 |
52 | frm := widgets.NewQFrame(widget, 0)
53 | frm.SetGeometry2(130, 22, 100, 100)
54 | frm.SetStyleSheet("QWidget { background-color: " + color.Name() + " }")
55 |
56 | btn := widgets.NewQPushButton2("Dialog", widget)
57 | btn.Move2(20, 20)
58 | btn.ConnectClicked(func(checked bool) {
59 | colorDialog := widgets.NewQColorDialog(widget).GetColor(
60 | color,
61 | widget,
62 | "调色板",
63 | widgets.QColorDialog__ShowAlphaChannel)
64 |
65 | // 我们要先检查col的值。如果点击的是Cancel按钮,返回的颜色值是无效的。
66 | //当颜色值有效时,我们通过样式表(style sheet)来改变背景颜色。
67 | if colorDialog.IsValid() {
68 | fmt.Println("调色: ", colorDialog.Name())
69 | frm.SetStyleSheet("QWidget { background-color: " + colorDialog.Name() + " }")
70 | }
71 | })
72 | }
73 |
74 | func main() {
75 | // 创建一个应用程序对象
76 | // sys.argv参数是一个列表,从命令行输入参数
77 | widgets.NewQApplication(len(os.Args), os.Args)
78 |
79 | // 初始化主窗口
80 | app := InitMainWindow()
81 |
82 | // 初始化组件
83 | InitComponents(app)
84 |
85 | // 控制窗口显示在屏幕中心的方法
86 | center(app)
87 |
88 | // 显示主窗口
89 | app.Show()
90 |
91 | // 确保应用程序干净的退出
92 | widgets.QApplication_Exec()
93 | }
94 |
--------------------------------------------------------------------------------
/combo_box/README.md:
--------------------------------------------------------------------------------
1 | # 下拉列表QComboBox
2 | - QComboBox是允许用户从下拉列表中进行选择的控件。
3 | - 示例中展示了一个QComboBox与一个QLabel,QComboBox控件中有5个选项(Linux系统的几个发行版名称)。
4 | - QLabel控件会显示QComboBox中选中的某个选项。
5 |
6 | ## 效果展示
7 | 
--------------------------------------------------------------------------------
/combo_box/go.mod:
--------------------------------------------------------------------------------
1 | module combo_box
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/combo_box/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/combo_box/images/2023-08-06_14-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/combo_box/images/2023-08-06_14-18.png
--------------------------------------------------------------------------------
/combo_box/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/combo_box/images/app.ico
--------------------------------------------------------------------------------
/combo_box/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | //widget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
45 | widget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(widget)
47 |
48 | // 标签
49 | lbl := widgets.NewQLabel2("Ubuntu", widget, 0)
50 | lbl.Move2(50, 150)
51 |
52 | // 下拉列表
53 | combo := widgets.NewQComboBox(widget)
54 | combo.Move2(50, 50)
55 | combo.AddItem("Ubuntu", core.NewQVariant15("Ubuntu"))
56 | combo.AddItem("Mandriva", core.NewQVariant15("Mandriva"))
57 | combo.AddItem("Fedora", core.NewQVariant15("Fedora"))
58 | combo.AddItem("Arch", core.NewQVariant15("Arch"))
59 | combo.AddItem("Gentoo", core.NewQVariant15("Gentoo"))
60 |
61 | // 当选中某个条目时会调用方法。
62 | combo.ConnectActivated2(func(text string) {
63 | // 在方法中我们将QLabel控件的内容设置为选中的条目,然后调整它的尺寸。
64 | lbl.SetText(text)
65 | // 滚动长度
66 | lbl.AdjustSize()
67 | })
68 | }
69 |
70 | func main() {
71 | // 创建一个应用程序对象
72 | // sys.argv参数是一个列表,从命令行输入参数
73 | widgets.NewQApplication(len(os.Args), os.Args)
74 |
75 | // 初始化主窗口
76 | app := InitMainWindow()
77 |
78 | // 初始化组件
79 | InitComponents(app)
80 |
81 | // 控制窗口显示在屏幕中心的方法
82 | center(app)
83 |
84 | // 显示主窗口
85 | app.Show()
86 |
87 | // 确保应用程序干净的退出
88 | widgets.QApplication_Exec()
89 | }
90 |
--------------------------------------------------------------------------------
/custom_key_press_event/README.md:
--------------------------------------------------------------------------------
1 | # 自定义按键事件处理器
2 | - 在示例中我们重新实现了 keyPressEvent()事件处理器。
3 | - 我们按下Escape键会使程序退出。
4 |
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/custom_key_press_event/go.mod:
--------------------------------------------------------------------------------
1 | module custom_key_press_event
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/custom_key_press_event/images/2023-08-05_17-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_key_press_event/images/2023-08-05_17-57.png
--------------------------------------------------------------------------------
/custom_key_press_event/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_key_press_event/images/app.ico
--------------------------------------------------------------------------------
/custom_key_press_event/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | return app
37 | }
38 |
39 | // InitComponents 初始化组件
40 | func InitComponents(app *widgets.QMainWindow) {
41 | }
42 |
43 | func main() {
44 | // 创建一个应用程序对象
45 | // sys.argv参数是一个列表,从命令行输入参数
46 | widgets.NewQApplication(len(os.Args), os.Args)
47 |
48 | // 初始化主窗口
49 | app := InitMainWindow()
50 |
51 | // 初始化组件
52 | InitComponents(app)
53 |
54 | // 控制窗口显示在屏幕中心的方法
55 | center(app)
56 |
57 | // 显示主窗口
58 | app.Show()
59 |
60 | // 确保应用程序干净的退出
61 | widgets.QApplication_Exec()
62 | }
63 |
--------------------------------------------------------------------------------
/custom_signal/README.md:
--------------------------------------------------------------------------------
1 | # 自定义Signal信号示例
2 | - 这是一个自定义示例的简单用法。
3 |
4 | ## 效果展示
5 | 
6 |
--------------------------------------------------------------------------------
/custom_signal/go.mod:
--------------------------------------------------------------------------------
1 | module custom_signal
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/custom_signal/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/custom_signal/images/2023-08-06_17-54.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_signal/images/2023-08-06_17-54.png
--------------------------------------------------------------------------------
/custom_signal/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_signal/images/app.ico
--------------------------------------------------------------------------------
/custom_signal/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "gosignal"
8 |
9 | "github.com/therecipe/qt/core"
10 | "github.com/therecipe/qt/gui"
11 | "github.com/therecipe/qt/widgets"
12 | )
13 |
14 | // 控制窗口显示在屏幕中心的方法
15 | func center(app *widgets.QMainWindow) {
16 | // 获得窗口
17 | qr := app.FrameGeometry()
18 |
19 | // 获得屏幕中心点
20 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
21 | // 显示到屏幕中心
22 | qr.MoveCenter(cp)
23 | app.Move(qr.TopLeft())
24 | }
25 |
26 | // InitMainWindow 初始化主窗口
27 | func InitMainWindow() *widgets.QMainWindow {
28 | // 创建窗口
29 | app := widgets.NewQMainWindow(nil, 0)
30 |
31 | // 设置窗口的标题
32 | app.SetWindowTitle("Qt 教程")
33 |
34 | // 设置窗口的位置和大小
35 | app.SetGeometry2(300, 300, 300, 220)
36 |
37 | // 设置窗口的图标,引用当前目录下的web.png图片
38 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
39 |
40 | return app
41 | }
42 |
43 | // InitComponents 初始化组件
44 | func InitComponents(app *widgets.QMainWindow) {
45 | // 布局窗口组件载体
46 | widget := widgets.NewQWidget(app, core.Qt__Widget)
47 | widget.SetGeometry2(0, 0, 300, 220)
48 | app.SetCentralWidget(widget)
49 |
50 | lbl := widgets.NewQLabel(widget, core.Qt__Widget)
51 | lbl.SetText("默认标签")
52 | lbl.Move2(10, 20)
53 |
54 | btn1 := widgets.NewQPushButton2("Modify Label", widget)
55 | btn1.SetObjectName("Button1")
56 | btn1.SetCheckable(true)
57 | btn1.Move2(30, 50)
58 |
59 | modifyLabelSignal := gosignal.NewGoSignal(nil)
60 | modifyLabelSignal.ConnectGoSignal(func(str string) {
61 | lbl.SetText(str)
62 | })
63 |
64 | btn1.ConnectClicked(func(checked bool) {
65 | fmt.Println("btn1 checked: ", checked)
66 | text := "默认标签"
67 | if checked {
68 | text = "信号标签"
69 | }
70 | modifyLabelSignal.Emit2(text)
71 | })
72 |
73 | btn2 := widgets.NewQPushButton2("Close App", widget)
74 | btn2.SetObjectName("Button2")
75 | btn2.Move2(150, 50)
76 |
77 | closeAppSignal := gosignal.NewGoSignal(nil)
78 | closeAppSignal.ConnectGoSignal(func() {
79 | app.Close()
80 | })
81 |
82 | btn2.ConnectClicked(func(checked bool) {
83 | closeAppSignal.Emit()
84 | })
85 | }
86 |
87 | func main() {
88 | // 创建一个应用程序对象
89 | // sys.argv参数是一个列表,从命令行输入参数
90 | widgets.NewQApplication(len(os.Args), os.Args)
91 |
92 | // 初始化主窗口
93 | app := InitMainWindow()
94 |
95 | // 初始化组件
96 | InitComponents(app)
97 |
98 | // 控制窗口显示在屏幕中心的方法
99 | center(app)
100 |
101 | // 显示主窗口
102 | app.Show()
103 |
104 | // 确保应用程序干净的退出
105 | widgets.QApplication_Exec()
106 | }
107 |
--------------------------------------------------------------------------------
/custom_signal_mouse_move_event/README.md:
--------------------------------------------------------------------------------
1 | # 鼠标移动发出信号
2 | - 重写鼠标移动事件;
3 | - 发送信号,传递参数;
4 |
5 | ## 效果展示
6 | 
7 |
--------------------------------------------------------------------------------
/custom_signal_mouse_move_event/go.mod:
--------------------------------------------------------------------------------
1 | module custom_signal_mouse_move_event
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/custom_signal_mouse_move_event/images/2023-08-06_17-54.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_signal_mouse_move_event/images/2023-08-06_17-54.png
--------------------------------------------------------------------------------
/custom_signal_mouse_move_event/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/custom_signal_mouse_move_event/images/app.ico
--------------------------------------------------------------------------------
/custom_signal_mouse_move_event/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "gosignal"
8 |
9 | "github.com/therecipe/qt/gui"
10 | "github.com/therecipe/qt/widgets"
11 | )
12 |
13 | // 控制窗口显示在屏幕中心的方法
14 | func center(app *widgets.QMainWindow) {
15 | // 获得窗口
16 | qr := app.FrameGeometry()
17 |
18 | // 获得屏幕中心点
19 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
20 | // 显示到屏幕中心
21 | qr.MoveCenter(cp)
22 | app.Move(qr.TopLeft())
23 | }
24 |
25 | // InitMainWindow 初始化主窗口
26 | func InitMainWindow() *widgets.QMainWindow {
27 | // 创建窗口
28 | app := widgets.NewQMainWindow(nil, 0)
29 |
30 | // 设置窗口的标题
31 | app.SetWindowTitle("Qt 教程")
32 |
33 | // 设置窗口的位置和大小
34 | app.SetGeometry2(300, 300, 300, 220)
35 |
36 | // 设置窗口的图标,引用当前目录下的web.png图片
37 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
38 |
39 | return app
40 | }
41 |
42 | // InitComponents 初始化组件
43 | func InitComponents(app *widgets.QMainWindow) {
44 | // 连接信号
45 | signal := gosignal.NewGoSignal(nil)
46 | signal.ConnectGoSignal(getData)
47 |
48 | // 鼠标事件处理器重写
49 | app.ConnectMoveEvent(moveEvent(signal))
50 | }
51 |
52 | // 移动事件
53 | func moveEvent(signal *gosignal.GoSignal) func(event *gui.QMoveEvent) {
54 | return func(event *gui.QMoveEvent) {
55 | // 发送信号: 坐标
56 | // event.Pos().X(),event.Pos().Y()
57 | _ = signal.Emit2([]interface{}{event.Pos().X(), event.Pos().Y()})
58 | fmt.Println("getData: ", event.Pos().X(), event.Pos().Y())
59 | }
60 | }
61 |
62 | // 获取移动事件发送的数据
63 | func getData(args interface{}) {
64 | fmt.Println("getData: ", args)
65 | }
66 |
67 | func main() {
68 | // 创建一个应用程序对象
69 | // sys.argv参数是一个列表,从命令行输入参数
70 | widgets.NewQApplication(len(os.Args), os.Args)
71 |
72 | // 初始化主窗口
73 | app := InitMainWindow()
74 |
75 | // 初始化组件
76 | InitComponents(app)
77 |
78 | // 控制窗口显示在屏幕中心的方法
79 | center(app)
80 |
81 | // 显示主窗口
82 | app.Show()
83 |
84 | // 确保应用程序干净的退出
85 | widgets.QApplication_Exec()
86 | }
87 |
--------------------------------------------------------------------------------
/docs/Qt环境安装.md:
--------------------------------------------------------------------------------
1 | # Qt工具文档
2 |
3 | ## 在GOPATH(全局安装)模式
4 | ```shell
5 | export GO111MODULE=off \
6 | && go get -v github.com/therecipe/qt/cmd/... \
7 | && go install -v -tags=no_env github.com/therecipe/qt/cmd/... \
8 | && $(go env GOPATH)/bin/qtsetup -test=false
9 | ```
10 |
11 | ## 在模块(每个项目)模式下(要解决 GFW 问题,您可以使用如下代理GOPROXY=https://goproxy.io:)
12 | ```shell
13 | export GO111MODULE=on; go get -v github.com/therecipe/qt && go install -v -tags=no_env github.com/therecipe/qt/cmd/... && go mod vendor && rm -rf vendor/github.com/therecipe/env_linux_amd64_513 && git clone https://github.com/therecipe/env_linux_amd64_513.git vendor/github.com/therecipe/env_linux_amd64_513 && $(go env GOPATH)/bin/qtsetup
14 | ```
15 |
16 | ## qt编译
17 | ```shell
18 | go mod vendor
19 |
20 | GOWORK=off qtdeploy -fast test desktop
21 | ```
22 |
23 | ## qt编译2
24 | ```shell
25 | go mod vendor
26 |
27 | GOWORK=off qtdeploy -qt_dir=../vendor/github.com/therecipe/env_linux_amd64_513 -qt_version=5.13.0 build desktop main.go
28 | ```
29 |
30 | ## qt编译2
31 | ```shell
32 | go mod vendor
33 |
34 | git clone https://github.com/therecipe/env_linux_amd64_513.git vendor/github.com/therecipe/env_linux_amd64_513
35 | GOWORK=off qtdeploy -qt_dir=../vendor/github.com/therecipe/env_linux_amd64_513 build desktop
36 | ```
37 |
38 | ## qt编译2
39 | ```shell
40 | go mod vendor
41 |
42 | GOWORK=off qtdeploy build desktop
43 | ```
--------------------------------------------------------------------------------
/docs/goqtuic工具.md:
--------------------------------------------------------------------------------
1 | # goqtuic工具
2 | ui 转 golang 工具
3 |
4 | ## 安装工具
5 | ```shell
6 | go get -u -v github.com/stephenlyu/goqtuic
7 |
8 | goqtuic -h
9 | ```
10 |
11 | ## 将xx.ui文件转化成golang文件并放到目录uitogo下
12 | ```shell
13 | goqtuic -go-ui-dir="uitogo" -ui-file=xx.ui
14 | ```
--------------------------------------------------------------------------------
/docs/交叉编译文档.md:
--------------------------------------------------------------------------------
1 | # 交叉编译文档
2 | - GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
3 | - GOARCH:目标平台的体系架构(386、amd64、arm)
4 | - 交叉编译不支持 CGO 所以要禁用它
5 |
6 |
7 | ## Mac 下编译 Linux 和 Windows 64位可执行程序
8 | - linux
9 | ```
10 | CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
11 | ```
12 |
13 | - windows
14 | ```
15 | CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
16 | ```
17 |
18 | ## Linux 下编译 Mac 和 Windows 64位可执行程序
19 | - darwin
20 | ```
21 | CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
22 | ```
23 | - windows
24 | ```
25 | CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
26 | ```
27 |
28 | ## Windows 下编译 Mac 和 Linux 64位可执行程序
29 | - darwin
30 | ```
31 | SET CGO_ENABLED=0
32 | SET GOOS=darwin
33 | SET GOARCH=amd64
34 | go build main.go
35 | ```
36 | - linux
37 | ```
38 | SET CGO_ENABLED=0
39 | SET GOOS=linux
40 | SET GOARCH=amd64
41 | go build main.go
42 | ```
43 |
--------------------------------------------------------------------------------
/empty_window/README.md:
--------------------------------------------------------------------------------
1 | # 空窗口
2 | 创建一个空白窗口,并简洁的设置窗口的一些属性。
3 |
4 | ## 效果展示
5 | 
6 |
--------------------------------------------------------------------------------
/empty_window/go.mod:
--------------------------------------------------------------------------------
1 | module empty_window
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/empty_window/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/empty_window/images/2023-08-05_17-54.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/empty_window/images/2023-08-05_17-54.png
--------------------------------------------------------------------------------
/empty_window/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/empty_window/images/app.ico
--------------------------------------------------------------------------------
/empty_window/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // InitMainWindow 初始化主窗口
11 | func InitMainWindow() *widgets.QMainWindow {
12 | // 创建窗口
13 | app := widgets.NewQMainWindow(nil, 0)
14 |
15 | // 设置窗口的标题
16 | app.SetWindowTitle("Qt 教程")
17 |
18 | // 设置窗口的位置和大小
19 | app.SetGeometry2(300, 300, 300, 220)
20 |
21 | // 设置窗口的图标,引用当前目录下的web.png图片
22 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
23 |
24 | return app
25 | }
26 |
27 | func main() {
28 | // 创建一个应用程序对象
29 | // sys.argv参数是一个列表,从命令行输入参数
30 | widgets.NewQApplication(len(os.Args), os.Args)
31 |
32 | // 初始化主窗口
33 | app := InitMainWindow()
34 |
35 | // 显示主窗口
36 | app.Show()
37 |
38 | // 确保应用程序干净的退出
39 | widgets.QApplication_Exec()
40 | }
41 |
--------------------------------------------------------------------------------
/file_dialog/README.md:
--------------------------------------------------------------------------------
1 | # 文件对话框QFileDialog
2 | - QFileDialog是一个让用户选择文件和目录的对话框,可用以选择打开或保存文件;
3 | - 这个例子展示了一个菜单栏,中部TextEdit控件和一个状态栏;
4 | - 菜单项Open会显示用于选择文件的QtGui.QFileDialog对话框;
5 | - 选定文件的内容会加载到TextEdit控件中。
6 |
7 |
8 |
9 | ## 效果展示
10 | 
11 | 
--------------------------------------------------------------------------------
/file_dialog/go.mod:
--------------------------------------------------------------------------------
1 | module file_dialog
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/file_dialog/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/file_dialog/images/2023-08-06_12-25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog/images/2023-08-06_12-25.png
--------------------------------------------------------------------------------
/file_dialog/images/2023-08-06_12-25_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog/images/2023-08-06_12-25_1.png
--------------------------------------------------------------------------------
/file_dialog/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog/images/app.ico
--------------------------------------------------------------------------------
/file_dialog_by_dir/README.md:
--------------------------------------------------------------------------------
1 | # 文件对话框QFileDialog-目录
2 | - QFileDialog是一个让用户选择文件和目录的对话框,可用以选择打开或保存文件;
3 | - 这个例子展示了一个菜单栏,中部TextEdit控件和一个状态栏;
4 | - 菜单项Open会显示用于选择文件的QtGui.QFileDialog对话框;
5 | - 选定目录路径会加载到TextEdit控件中。
6 |
7 |
8 |
9 | ## 效果展示
10 | 
11 | 
--------------------------------------------------------------------------------
/file_dialog_by_dir/go.mod:
--------------------------------------------------------------------------------
1 | module file_dialog_by_dir
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/file_dialog_by_dir/images/2023-08-06_12-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog_by_dir/images/2023-08-06_12-23.png
--------------------------------------------------------------------------------
/file_dialog_by_dir/images/2023-08-06_12-23_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog_by_dir/images/2023-08-06_12-23_1.png
--------------------------------------------------------------------------------
/file_dialog_by_dir/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/file_dialog_by_dir/images/app.ico
--------------------------------------------------------------------------------
/file_dialog_by_dir/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "reflect"
7 |
8 | "github.com/therecipe/qt/core"
9 | "github.com/therecipe/qt/gui"
10 | "github.com/therecipe/qt/widgets"
11 | )
12 |
13 | // 控制窗口显示在屏幕中心的方法
14 | func center(app *widgets.QMainWindow) {
15 | // 获得窗口
16 | qr := app.FrameGeometry()
17 |
18 | // 获得屏幕中心点
19 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
20 | // 显示到屏幕中心
21 | qr.MoveCenter(cp)
22 | app.Move(qr.TopLeft())
23 | }
24 |
25 | // InitMainWindow 初始化主窗口
26 | func InitMainWindow() *widgets.QMainWindow {
27 | // 创建窗口
28 | app := widgets.NewQMainWindow(nil, 0)
29 |
30 | // 设置窗口的标题
31 | app.SetWindowTitle("Qt 教程")
32 |
33 | // 设置窗口的位置和大小
34 | app.SetGeometry2(300, 300, 300, 220)
35 |
36 | // 设置窗口的图标,引用当前目录下的web.png图片
37 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
38 |
39 | return app
40 | }
41 |
42 | // InitComponents 初始化组件
43 | func InitComponents(app *widgets.QMainWindow) {
44 | // 布局窗口组件载体
45 | widget := widgets.NewQWidget(app, core.Qt__Widget)
46 | widget.SetGeometry2(0, 0, 300, 220)
47 | app.SetCentralWidget(widget)
48 |
49 | // 文档框
50 | textEdit := widgets.NewQTextEdit(widget)
51 | app.SetCentralWidget(textEdit)
52 |
53 | menubar := app.MenuBar()
54 | fileMenu := menubar.AddMenu2("&File")
55 | // 创建一个事件和一个特定的图标和一个“退出”的标签。
56 | openFile := fileMenu.AddAction2(gui.NewQIcon5("images/app.ico"), "&Open")
57 | // 快捷键,自定义
58 | openFile.SetShortcut(gui.NewQKeySequence2("Ctrl+O", gui.QKeySequence__NativeText))
59 | // 提示语
60 | openFile.SetStatusTip("Open new File")
61 | // 事件触发
62 | openFile.ConnectTriggered(func(checked bool) {
63 | dirName := widgets.NewQFileDialog(app, core.Qt__Widget).
64 | GetExistingDirectory(app,
65 | "Open Dir", // 对话框的标题
66 | "/home", // 指定起始目录
67 | widgets.QFileDialog__DontUseNativeDialog,
68 | )
69 |
70 | if dirName != "" {
71 | textEdit.SetText(dirName)
72 | } else {
73 | fmt.Println(reflect.TypeOf(dirName), dirName)
74 | }
75 | })
76 | }
77 |
78 | func main() {
79 | // 创建一个应用程序对象
80 | // sys.argv参数是一个列表,从命令行输入参数
81 | widgets.NewQApplication(len(os.Args), os.Args)
82 |
83 | // 初始化主窗口
84 | app := InitMainWindow()
85 |
86 | // 初始化组件
87 | InitComponents(app)
88 |
89 | // 控制窗口显示在屏幕中心的方法
90 | center(app)
91 |
92 | // 显示主窗口
93 | app.Show()
94 |
95 | // 确保应用程序干净的退出
96 | widgets.QApplication_Exec()
97 | }
98 |
--------------------------------------------------------------------------------
/font_dialog/README.md:
--------------------------------------------------------------------------------
1 | # 字体对话框QFontDialog
2 | - QFontDialog 对话框用以选择字体;
3 | - 在这个例子中,我们创建了一个按钮和一个标签,通过QFontDialog来改变标签的字体。
4 |
5 |
6 |
7 | ## 效果展示
8 |
--------------------------------------------------------------------------------
/font_dialog/go.mod:
--------------------------------------------------------------------------------
1 | module font_dialog
2 |
3 | go 1.20
4 |
5 | require github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
6 |
7 | require github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
8 |
--------------------------------------------------------------------------------
/font_dialog/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/font_dialog/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/font_dialog/images/app.ico
--------------------------------------------------------------------------------
/font_dialog/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | lbl := widgets.NewQLabel2("Knowledge only matters", widget, 0)
48 | lbl.Move2(130, 20)
49 |
50 | btn := widgets.NewQPushButton2("Dialog", widget)
51 | // btn.SetSizePolicy(widgets.QSizePolicy__Fixed)
52 | btn.Move2(20, 20)
53 |
54 | vbox := widgets.NewQVBoxLayout2(widget)
55 | vbox.AddWidget(lbl, 0, core.Qt__AlignLeft)
56 | vbox.AddWidget(btn, 0, core.Qt__AlignLeft)
57 |
58 | btn.ConnectClicked(func(checked bool) {
59 | // 这一行代码弹出字体选择对话框,GetFont2()方法返回字体名称和ok参数,
60 | //如果用户点击了ok他就是True,否则就是false
61 | ok := false
62 | initialFont := gui.NewQFont2("Times", 100, 0, true)
63 | font := widgets.NewQFontDialog(app).
64 | GetFont(&ok, initialFont, app, "xxx", widgets.QFontDialog__DontUseNativeDialog)
65 | // 如果我们点击了ok,标签的字体就会被改变
66 | if ok {
67 | lbl.SetFont(font)
68 | }
69 | })
70 | }
71 |
72 | func main() {
73 | // 创建一个应用程序对象
74 | // sys.argv参数是一个列表,从命令行输入参数
75 | widgets.NewQApplication(len(os.Args), os.Args)
76 |
77 | // 初始化主窗口
78 | app := InitMainWindow()
79 |
80 | // 初始化组件
81 | InitComponents(app)
82 |
83 | // 控制窗口显示在屏幕中心的方法
84 | center(app)
85 |
86 | // 显示主窗口
87 | app.Show()
88 |
89 | // 确保应用程序干净的退出
90 | widgets.QApplication_Exec()
91 | }
92 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module qt-tutorial
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d // indirect
8 | github.com/therecipe/qt/internal/binding/files/docs/5.12.0 v0.0.0-20200904063919-c0c124a5770d // indirect
9 | github.com/therecipe/qt/internal/binding/files/docs/5.13.0 v0.0.0-20200904063919-c0c124a5770d // indirect
10 | )
11 |
--------------------------------------------------------------------------------
/go.work:
--------------------------------------------------------------------------------
1 | go 1.20
2 |
3 | use (
4 | ./button
5 | ./calendar_widget
6 | ./check_box
7 | ./close_window
8 | ./close_window_button_event
9 | ./color_dialog
10 | ./combo_box
11 | ./custom_key_press_event
12 | ./custom_signal
13 | ./custom_signal_mouse_move_event
14 | ./empty_window
15 | ./file_dialog
16 | ./file_dialog_by_dir
17 | ./font_dialog
18 | ./gosignal
19 | ./input_dialog
20 | ./layout_absolute_position
21 | ./layout_grid_layout
22 | ./layout_grid_layout_comment
23 | ./layout_hbox_layout
24 | ./layout_vbox_and_hbox_layout
25 | ./layout_vbox_layout
26 | ./line_edit
27 | ./menubar
28 | ./painter_color
29 | ./painter_draw_point
30 | ./painter_pen
31 | ./painter_text1
32 | ./painter_text2
33 | ./painter_text3
34 | ./painter_text4
35 | ./painter_text5
36 | ./password_input_dialog
37 | ./pixmap
38 | ./progress_bar
39 | ./qt_oop_struct
40 | ./screen_center
41 | ./signal_slot
42 | ./simple_drag
43 | ./simple_drag_button
44 | ./slider
45 | ./splitter
46 | ./statusbar
47 | ./tip
48 | ./toggle_button
49 | ./toolbar
50 | ./toolbar_and_statusbar
51 | ./ui_loader
52 | ./widget_sender_receiver
53 | ./widget_sender_receiver2
54 | )
55 |
--------------------------------------------------------------------------------
/go.work.sum:
--------------------------------------------------------------------------------
1 | github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
2 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a h1:XCr/YX7O0uxRkLq2k1ApNQMims9eCioF9UpzIPBDmuo=
3 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789 h1:FF0rjo15h51+N6642mf5S3QuplmKo2aCrJUYkHTx85s=
4 |
--------------------------------------------------------------------------------
/gosignal/README.md:
--------------------------------------------------------------------------------
1 | # 自定义Signal信号
2 | - 封装自定义通用Signal信号, 进行信号发送与事件连接。
3 | - ConnectGoSignal: 信号进行链接
4 | - Emit: 无参数的自定义信号
5 | - Emit2:可以传递参数的自定义信号,对应响应函数也必须有参数接收
6 |
--------------------------------------------------------------------------------
/gosignal/go.mod:
--------------------------------------------------------------------------------
1 | module gosignal
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/gosignal/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/gosignal/lib.go:
--------------------------------------------------------------------------------
1 | package gosignal
2 |
3 | import (
4 | "fmt"
5 | "reflect"
6 | "unsafe"
7 |
8 | "github.com/therecipe/qt"
9 | "github.com/therecipe/qt/core"
10 | )
11 |
12 | // GoSignal GO 自定义信号
13 | type GoSignal struct {
14 | *core.QObject
15 | innerFunc interface{}
16 | }
17 |
18 | // NewGoSignal 新建 GO 自定义信号对象
19 | func NewGoSignal(parent core.QObject_ITF) *GoSignal {
20 | return &GoSignal{
21 | QObject: core.NewQObject(parent),
22 | }
23 | }
24 |
25 | // ConnectGoSignal 连接信号
26 | func (g *GoSignal) ConnectGoSignal(f interface{}) {
27 | // 不存在信号则注册
28 | if !qt.ExistsSignal(g.Pointer(), "goSignal") {
29 | g.innerFunc = f
30 | qt.ConnectSignal(g.Pointer(), "goSignal", unsafe.Pointer(&f))
31 | }
32 | }
33 |
34 | // Emit 发送无参数信号
35 | func (g *GoSignal) Emit() (err error) {
36 | if signal := qt.LendSignal(g.Pointer(), "goSignal"); signal == nil {
37 | return fmt.Errorf("not ExistsSignal -> goSignal")
38 | }
39 | funcValue := reflect.ValueOf(g.innerFunc)
40 | params := make([]reflect.Value, 0)
41 | go funcValue.Call(params)
42 | // go g.innerFunc.(func())()
43 | return nil
44 | }
45 |
46 | // Emit2 发送携带参数的自定义信号,对应响应函数也必须有参数接收
47 | func (g *GoSignal) Emit2(args interface{}) error {
48 | if signal := qt.LendSignal(g.Pointer(), "goSignal"); signal == nil {
49 | return fmt.Errorf("not ExistsSignal -> goSignal")
50 | }
51 | funcValue := reflect.ValueOf(g.innerFunc)
52 | params := []reflect.Value{reflect.ValueOf(args)}
53 | go funcValue.Call(params)
54 | // go g.innerFunc.(func(args interface{}))(args)
55 | return nil
56 | }
57 |
--------------------------------------------------------------------------------
/input_dialog/README.md:
--------------------------------------------------------------------------------
1 | # 输入对话框QInputDialog
2 | - QFontDialog 对话框用以选择字体;
3 | - 在这个例子中,我们创建了一个按钮和一个标签,通过QFontDialog来改变标签的字体。
4 |
5 |
6 | ## 对话框简介
7 | - 对话框窗口或对话框是现代GUI应用程序最不可或缺的一部分。
8 | - 一个对话框被定义为两个或两个以上的人之间的谈话。
9 | - 在计算机应用程序对话框窗口用于“交谈”应用程序。
10 | - 一个对话框用于输入数据,修改数据,更改应用程序设置等。
11 |
12 |
13 | ## 效果展示
14 |
15 |
--------------------------------------------------------------------------------
/input_dialog/go.mod:
--------------------------------------------------------------------------------
1 | module input_dialog
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/input_dialog/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/input_dialog/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/input_dialog/images/app.ico
--------------------------------------------------------------------------------
/input_dialog/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | btn := widgets.NewQPushButton2("Dialog", widget)
48 | btn.Move2(20, 20)
49 |
50 | le := widgets.NewQLineEdit(widget)
51 | le.Move2(130, 22)
52 |
53 | btn.ConnectClicked(func(checked bool) {
54 | ok := false
55 | input := widgets.NewQInputDialog(widget, core.Qt__Widget)
56 | text := input.GetText(
57 | widget,
58 | "Input Dialog",
59 | "Enter your name:",
60 | widgets.QLineEdit__Normal,
61 | "",
62 | &ok,
63 | core.Qt__Widget,
64 | core.Qt__ImhNone,
65 | )
66 | // 对话框收到的文本消息会显示在文本框中
67 | if ok {
68 | le.SetText(text)
69 | }
70 | })
71 |
72 | }
73 |
74 | func main() {
75 | // 创建一个应用程序对象
76 | // sys.argv参数是一个列表,从命令行输入参数
77 | widgets.NewQApplication(len(os.Args), os.Args)
78 |
79 | // 初始化主窗口
80 | app := InitMainWindow()
81 |
82 | // 初始化组件
83 | InitComponents(app)
84 |
85 | // 控制窗口显示在屏幕中心的方法
86 | center(app)
87 |
88 | // 显示主窗口
89 | app.Show()
90 |
91 | // 确保应用程序干净的退出
92 | widgets.QApplication_Exec()
93 | }
94 |
--------------------------------------------------------------------------------
/layout_absolute_position/README.md:
--------------------------------------------------------------------------------
1 | # 布局-绝对位置定位
2 | 本节开始学习一些布局管理。
3 | 创建一些标签,按绝对位置进行摆放。
4 |
5 |
6 | ## Qt 布局有两种方式
7 | - 绝对位置定位
8 | - 布局管理器
9 |
10 |
11 | ## 绝对定位介绍
12 | - 绝对定位:程序指定每个控件的位置和大小(以像素为单位)。
13 | - 绝对定位有以下限制:
14 | - 如果我们调整窗口,控件的大小和位置不会改变;
15 | - 在各种平台上应用程序看起来会不一样;
16 | - 如果改变字体,我们的应用程序的布局就会改变;
17 | - 如果我们决定改变我们的布局,我们必须完全重做我们的布局;
18 | - 我们使用 Move2() 方法来控制控件的位置。
19 |
20 | ## 效果展示
21 | 
22 |
23 |
--------------------------------------------------------------------------------
/layout_absolute_position/go.mod:
--------------------------------------------------------------------------------
1 | module layout_absolute_position
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/layout_absolute_position/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_absolute_position/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_absolute_position/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_absolute_position/images/app.ico
--------------------------------------------------------------------------------
/layout_absolute_position/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | return app
37 | }
38 |
39 | // InitComponents 初始化组件
40 | func InitComponents(app *widgets.QMainWindow) {
41 | lbl1 := widgets.NewQLabel2("Zetcode", app, 0)
42 | lbl1.Move2(15, 10)
43 |
44 | lbl2 := widgets.NewQLabel2("tutorials", app, 0)
45 | lbl2.Move2(35, 40)
46 |
47 | lbl3 := widgets.NewQLabel2("for programmers", app, 0)
48 | lbl3.Move2(55, 70)
49 | }
50 |
51 | func main() {
52 | // 创建一个应用程序对象
53 | // sys.argv参数是一个列表,从命令行输入参数
54 | widgets.NewQApplication(len(os.Args), os.Args)
55 |
56 | // 初始化主窗口
57 | app := InitMainWindow()
58 |
59 | // 初始化组件
60 | InitComponents(app)
61 |
62 | // 控制窗口显示在屏幕中心的方法
63 | center(app)
64 |
65 | // 显示主窗口
66 | app.Show()
67 |
68 | // 确保应用程序干净的退出
69 | widgets.QApplication_Exec()
70 | }
71 |
--------------------------------------------------------------------------------
/layout_grid_layout/README.md:
--------------------------------------------------------------------------------
1 | # 布局-网格布局
2 | - 网格布局将空间划分为行和列。
3 | - 我们使用QGridLayout类创建一个网格布局。
4 | - 在我们的示例中,我们创建一个网格的按钮并且对按钮名称进行填充。
5 |
6 |
7 | ## 效果展示
8 | 
9 |
10 |
--------------------------------------------------------------------------------
/layout_grid_layout/go.mod:
--------------------------------------------------------------------------------
1 | module layout_grid_layout
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/layout_grid_layout/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_grid_layout/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_grid_layout/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_grid_layout/images/app.ico
--------------------------------------------------------------------------------
/layout_grid_layout/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | layoutWidget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(layoutWidget)
46 |
47 | // 表格布局
48 | grid := widgets.NewQGridLayout(layoutWidget)
49 | grid.SetContentsMargins(0, 0, 0, 0)
50 |
51 | names := []string{
52 | "Cls", "Bck", "", "Close",
53 | "7", "8", "9", "/",
54 | "4", "5", "6", "*",
55 | "1", "2", "3", "-",
56 | "0", ".", "=", "+",
57 | }
58 | // 我们创建一个网格中的位置的列表
59 | var positions [20][2]int
60 | k := 0
61 | for i := 0; i < 5; i++ {
62 | for j := 0; j < 4; j++ {
63 | item := [2]int{i, j}
64 | positions[k] = item
65 | k += 1
66 | }
67 | }
68 |
69 | // 创建按钮并使用 AddWidget()方法添加到布局中。
70 | for index := range positions {
71 | button := widgets.NewQPushButton2(names[index], layoutWidget)
72 | value := positions[index]
73 | grid.AddWidget2(button, value[0], value[1], core.Qt__AlignLeft)
74 | }
75 | }
76 |
77 | func main() {
78 | // 创建一个应用程序对象
79 | // sys.argv参数是一个列表,从命令行输入参数
80 | widgets.NewQApplication(len(os.Args), os.Args)
81 |
82 | // 初始化主窗口
83 | app := InitMainWindow()
84 |
85 | // 初始化组件
86 | InitComponents(app)
87 |
88 | // 控制窗口显示在屏幕中心的方法
89 | center(app)
90 |
91 | // 显示主窗口
92 | app.Show()
93 |
94 | // 确保应用程序干净的退出
95 | widgets.QApplication_Exec()
96 | }
97 |
--------------------------------------------------------------------------------
/layout_grid_layout_comment/README.md:
--------------------------------------------------------------------------------
1 | # 布局-网格布局-评论示例
2 | - 控件可以在网格中跨越多个行或列。
3 | - 我们创建一个窗口,其中有三个标签,两个行编辑和一个文本编辑窗口小控件。
4 | - 然后使用QGridLayout完成布局。
5 | - 在添加一个小的控件到网格的时候,我们可以提供小部件的行和列跨。
6 | - 在例子中,reviewEdit控件跨度5行。
7 | - 这是一个表格布局使用案例。
8 |
9 |
10 | ## 效果展示
11 | 
12 |
13 |
--------------------------------------------------------------------------------
/layout_grid_layout_comment/go.mod:
--------------------------------------------------------------------------------
1 | module layout_grid_layout_comment
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/layout_grid_layout_comment/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_grid_layout_comment/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_grid_layout_comment/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_grid_layout_comment/images/app.ico
--------------------------------------------------------------------------------
/layout_grid_layout_comment/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | layoutWidget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(layoutWidget)
46 |
47 | // 表格布局
48 | grid := widgets.NewQGridLayout(layoutWidget)
49 | grid.SetContentsMargins(5, 5, 5, 0)
50 | // 设置组件之间的间距。
51 | grid.SetSpacing(10)
52 |
53 | title := widgets.NewQLabel2("Title", layoutWidget, core.Qt__Widget)
54 | author := widgets.NewQLabel2("Author", layoutWidget, core.Qt__Widget)
55 | review := widgets.NewQLabel2("Review", layoutWidget, core.Qt__Widget)
56 |
57 | titleEdit := widgets.NewQLineEdit(layoutWidget)
58 | authorEdit := widgets.NewQLineEdit(layoutWidget)
59 | reviewEdit := widgets.NewQLineEdit(layoutWidget)
60 | // 设置大小
61 | reviewEdit.Resize2(600, 300)
62 |
63 | grid.AddWidget2(title, 1, 0, core.Qt__AlignLeft)
64 | grid.AddWidget2(titleEdit, 1, 1, core.Qt__AlignLeft)
65 |
66 | grid.AddWidget2(author, 2, 0, core.Qt__AlignLeft)
67 | grid.AddWidget2(authorEdit, 2, 1, core.Qt__AlignLeft)
68 |
69 | grid.AddWidget2(review, 3, 0, core.Qt__AlignLeft)
70 | grid.AddWidget3(reviewEdit, 4, 0, 2, 2, core.Qt__AlignCenter)
71 | }
72 |
73 | func main() {
74 | // 创建一个应用程序对象
75 | // sys.argv参数是一个列表,从命令行输入参数
76 | widgets.NewQApplication(len(os.Args), os.Args)
77 |
78 | // 初始化主窗口
79 | app := InitMainWindow()
80 |
81 | // 初始化组件
82 | InitComponents(app)
83 |
84 | // 控制窗口显示在屏幕中心的方法
85 | center(app)
86 |
87 | // 显示主窗口
88 | app.Show()
89 |
90 | // 确保应用程序干净的退出
91 | widgets.QApplication_Exec()
92 | }
93 |
--------------------------------------------------------------------------------
/layout_hbox_layout/README.md:
--------------------------------------------------------------------------------
1 | # 布局-横向布局
2 | 我们使用 NewQHBoxLayout 创建横向布局并添加伸展因子。
3 |
4 |
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/layout_hbox_layout/go.mod:
--------------------------------------------------------------------------------
1 | module layout_hbox_layout
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/layout_hbox_layout/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_hbox_layout/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_hbox_layout/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_hbox_layout/images/app.ico
--------------------------------------------------------------------------------
/layout_hbox_layout/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | //layoutWidget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
45 | layoutWidget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(layoutWidget)
47 |
48 | okButton := widgets.NewQPushButton2("OK", layoutWidget)
49 | cancelButton := widgets.NewQPushButton2("Cancel", layoutWidget)
50 |
51 | // 水平布局
52 | // 我们创建一个水平布局和添加一个伸展因子和两个按钮。
53 | hbox := widgets.NewQHBoxLayout2(layoutWidget)
54 | hbox.SetContentsMargins(0, 0, 0, 0)
55 | // 两个按钮前的伸展增加了一个可伸缩的空间。这将推动他们靠右显示。
56 | hbox.AddStretch(1)
57 | // 为布局中添加控件,stretch(拉伸因子)只适用与QBoxLayout,widget和box会随着stretch的变大而增大;alignment指定对齐的方式
58 | hbox.AddWidget(okButton, 0, core.Qt__AlignRight)
59 | hbox.AddWidget(cancelButton, 0, core.Qt__AlignRight)
60 | //hbox.Layout().AddWidget(okButton) // 推荐上方的写法
61 | //hbox.Layout().AddWidget(cancelButton)
62 | }
63 |
64 | func main() {
65 | // 创建一个应用程序对象
66 | // sys.argv参数是一个列表,从命令行输入参数
67 | widgets.NewQApplication(len(os.Args), os.Args)
68 |
69 | // 初始化主窗口
70 | app := InitMainWindow()
71 |
72 | // 初始化组件
73 | InitComponents(app)
74 |
75 | // 控制窗口显示在屏幕中心的方法
76 | center(app)
77 |
78 | // 显示主窗口
79 | app.Show()
80 |
81 | // 确保应用程序干净的退出
82 | widgets.QApplication_Exec()
83 | }
84 |
--------------------------------------------------------------------------------
/layout_vbox_and_hbox_layout/README.md:
--------------------------------------------------------------------------------
1 | # 布局-纵向布局与横向布局组合
2 | 我们使用 NewQHBoxLayout 和 NewQVBoxLayout,来分别创建横向布局和纵向布局, 将横向布局中添加纵向布局中。
3 |
4 |
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/layout_vbox_and_hbox_layout/go.mod:
--------------------------------------------------------------------------------
1 | module layout_vbox_and_hbox_layout
2 |
3 | go 1.20
4 |
5 | require github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
6 |
7 | require github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
8 |
--------------------------------------------------------------------------------
/layout_vbox_and_hbox_layout/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_vbox_and_hbox_layout/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_vbox_and_hbox_layout/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_vbox_and_hbox_layout/images/app.ico
--------------------------------------------------------------------------------
/layout_vbox_and_hbox_layout/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | layoutWidget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(layoutWidget)
46 |
47 | // 纵向布局
48 | okVButton := widgets.NewQPushButton2("OK-V", layoutWidget)
49 | cancelVButton := widgets.NewQPushButton2("Cancel-V", layoutWidget)
50 | vbox := widgets.NewQVBoxLayout2(layoutWidget)
51 | vbox.SetObjectName("vbox")
52 | vbox.SetContentsMargins(20, 20, 0, 0)
53 | vbox.AddWidget(okVButton, 0, core.Qt__AlignTop)
54 | vbox.AddWidget(cancelVButton, 0, core.Qt__AlignTop)
55 |
56 | // 横向布局
57 | okButton := widgets.NewQPushButton2("OK", layoutWidget)
58 | cancelButton := widgets.NewQPushButton2("Cancel", layoutWidget)
59 | hbox := widgets.NewQHBoxLayout()
60 | hbox.SetObjectName("vbox")
61 | hbox.SetContentsMargins(0, 0, 0, 0)
62 | hbox.AddStretch(1)
63 | hbox.AddWidget(okButton, 0, core.Qt__AlignRight)
64 | hbox.AddWidget(cancelButton, 0, core.Qt__AlignRight)
65 |
66 | // 横向布局中添加纵向布局
67 | vbox.AddStretch(1)
68 | vbox.AddLayout(hbox, 0)
69 | }
70 |
71 | func main() {
72 | // 创建一个应用程序对象
73 | // sys.argv参数是一个列表,从命令行输入参数
74 | widgets.NewQApplication(len(os.Args), os.Args)
75 |
76 | // 初始化主窗口
77 | app := InitMainWindow()
78 |
79 | // 初始化组件
80 | InitComponents(app)
81 |
82 | // 控制窗口显示在屏幕中心的方法
83 | center(app)
84 |
85 | // 显示主窗口
86 | app.Show()
87 |
88 | // 确保应用程序干净的退出
89 | widgets.QApplication_Exec()
90 | }
91 |
--------------------------------------------------------------------------------
/layout_vbox_layout/README.md:
--------------------------------------------------------------------------------
1 | # 布局-纵向布局
2 | 我们使用 NewQVBoxLayout 创建纵向布局并添加伸展因子。
3 |
4 |
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/layout_vbox_layout/go.mod:
--------------------------------------------------------------------------------
1 | module layout_vbox_layout
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/layout_vbox_layout/images/2023-08-05_18-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_vbox_layout/images/2023-08-05_18-08.png
--------------------------------------------------------------------------------
/layout_vbox_layout/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/layout_vbox_layout/images/app.ico
--------------------------------------------------------------------------------
/layout_vbox_layout/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | // layoutWidget.SetGeometry(core.NewQRect4(300, 300, 300, 220))
45 | layoutWidget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(layoutWidget)
47 |
48 | okVButton := widgets.NewQPushButton2("OK-V", layoutWidget)
49 | cancelVButton := widgets.NewQPushButton2("Cancel-V", layoutWidget)
50 |
51 | // 纵向布局
52 | // 创建一个垂直布局,并添加伸展因子,让水平布局显示在窗口底部
53 | vbox := widgets.NewQVBoxLayout2(layoutWidget)
54 | vbox.SetContentsMargins(20, 20, 0, 0)
55 | vbox.AddWidget(okVButton, 0, core.Qt__AlignTop)
56 | vbox.AddWidget(cancelVButton, 0, core.Qt__AlignTop)
57 | }
58 |
59 | func main() {
60 | // 创建一个应用程序对象
61 | // sys.argv参数是一个列表,从命令行输入参数
62 | widgets.NewQApplication(len(os.Args), os.Args)
63 |
64 | // 初始化主窗口
65 | app := InitMainWindow()
66 |
67 | // 初始化组件
68 | InitComponents(app)
69 |
70 | // 控制窗口显示在屏幕中心的方法
71 | center(app)
72 |
73 | // 显示主窗口
74 | app.Show()
75 |
76 | // 确保应用程序干净的退出
77 | widgets.QApplication_Exec()
78 | }
79 |
--------------------------------------------------------------------------------
/line_edit/README.md:
--------------------------------------------------------------------------------
1 | # 文本框QLineEdit
2 | - QLineEdit是用于输入或编辑单行文本的控件。
3 | - 它还有撤销重做、剪切复制和拖拽功能。
4 | - 示例中展示了一个QLineEdit与一个QLabel。
5 | - 我们在QLineEdit中输入的文字会实时显示在QLabel控件中。
6 |
7 |
8 | ## 效果展示
9 | 
10 |
11 |
--------------------------------------------------------------------------------
/line_edit/go.mod:
--------------------------------------------------------------------------------
1 | module line_edit
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/line_edit/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/line_edit/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/line_edit/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/line_edit/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/line_edit/images/app.ico
--------------------------------------------------------------------------------
/line_edit/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | // 标签
48 | lbl := widgets.NewQLabel(widget, core.Qt__Widget)
49 | lbl.Move2(60, 40)
50 |
51 | // 文本框
52 | qle := widgets.NewQLineEdit(widget)
53 | qle.Move2(60, 100)
54 |
55 | // 文本框的内容发生改变的时候,会调用方法
56 | qle.ConnectTextChanged(func(text string) {
57 | //在方法中我们将QLabel控件的文本设置为输入的内容。
58 | lbl.SetText(text)
59 | //通过调用adjustSize()方法将QLabel控件的尺寸调整为文本的长度。
60 | lbl.AdjustSize()
61 | })
62 | }
63 |
64 | func main() {
65 | // 创建一个应用程序对象
66 | // sys.argv参数是一个列表,从命令行输入参数
67 | widgets.NewQApplication(len(os.Args), os.Args)
68 |
69 | // 初始化主窗口
70 | app := InitMainWindow()
71 |
72 | // 初始化组件
73 | InitComponents(app)
74 |
75 | // 控制窗口显示在屏幕中心的方法
76 | center(app)
77 |
78 | // 显示主窗口
79 | app.Show()
80 |
81 | // 确保应用程序干净的退出
82 | widgets.QApplication_Exec()
83 | }
84 |
--------------------------------------------------------------------------------
/menubar/README.md:
--------------------------------------------------------------------------------
1 | # 状态栏
2 | - 本节开始菜单和工具栏的基本使用。
3 | - 状态栏用于显示状态信息。
4 | - 你用 QMainWindow 创建状态栏的小窗口。
5 | - QMainWindow 类第一次调用 StatusBar()方法创建一个状态栏。
6 | - 后续调用返回的状态栏对象。ShowMessage()状态栏上显示一条消息。
7 |
8 |
9 |
10 | ## 效果展示
11 | 
12 |
13 |
--------------------------------------------------------------------------------
/menubar/go.mod:
--------------------------------------------------------------------------------
1 | module menubar
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/menubar/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/menubar/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/menubar/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/menubar/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/menubar/images/app.ico
--------------------------------------------------------------------------------
/menubar/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | // 状态栏
37 | //timeout: 显示时间, -1: 一直显示
38 | app.StatusBar().ShowMessage("Ready", -1)
39 | // app.StatusBar().ShowMessage("Ready", 5)
40 |
41 | return app
42 | }
43 |
44 | // InitComponents 初始化组件
45 | func InitComponents(app *widgets.QMainWindow) {
46 | // 退出操作
47 | exitAction := widgets.NewQAction3(gui.NewQIcon5("images/app.ico"), "&Exit", nil)
48 | // 快捷键,自定义
49 | exitAction.SetShortcut(gui.NewQKeySequence2("Ctrl+Q", gui.QKeySequence__NativeText))
50 | // 提示语
51 | exitAction.SetStatusTip("Exit application")
52 | // 事件触发
53 | exitAction.ConnectTriggered(func(checked bool) {
54 | app.Close()
55 | })
56 |
57 | actions := widgets.NewQActionGroup(app)
58 | actions.AddAction(exitAction)
59 |
60 | //创建一个菜单栏
61 | // menubar := widgets.NewQMenuBar(app)
62 | menubar := app.MenuBar()
63 | //添加菜单
64 | fileMenu := menubar.AddMenu2("&File")
65 | fileMenu.AddActions(actions.Actions())
66 | }
67 |
68 | func main() {
69 | // 创建一个应用程序对象
70 | // sys.argv参数是一个列表,从命令行输入参数
71 | widgets.NewQApplication(len(os.Args), os.Args)
72 |
73 | // 初始化主窗口
74 | app := InitMainWindow()
75 |
76 | // 初始化组件
77 | InitComponents(app)
78 |
79 | // 控制窗口显示在屏幕中心的方法
80 | center(app)
81 |
82 | // 显示主窗口
83 | app.Show()
84 |
85 | // 确保应用程序干净的退出
86 | widgets.QApplication_Exec()
87 | }
88 |
--------------------------------------------------------------------------------
/painter_color/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-颜色QColor
2 | - 颜色是一个对象代表红、绿、蓝(RGB)强度值。有效的RGB值的范围从0到255。
3 | - 们可以用不同的方法定义了一个颜色。最常见的是RGB十进制或十六进制值的值。
4 | - 我们也可以使用一个RGBA值代表红色,绿色,蓝色,透明度。我们添加一些额外的信息透明度。
5 | - 透明度值255定义了完全不透明,0是完全透明的,例如颜色是无形的。
6 | - 实例中我们绘制了3个不同颜色的矩形。
7 |
8 |
9 | ## 效果展示
10 | 
11 |
12 |
--------------------------------------------------------------------------------
/painter_color/go.mod:
--------------------------------------------------------------------------------
1 | module painter_color
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_color/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/painter_color/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_color/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_color/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_color/images/app.ico
--------------------------------------------------------------------------------
/painter_color/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | // widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 | //qp.Begin(widget)
50 |
51 | col := gui.NewQColor3(0, 0, 0, 0)
52 | // 定义一个使用十六进制符号颜色。
53 | col.SetNamedColor("#d4d4d4")
54 | qp.SetPen2(col)
55 |
56 | // 设置画刷颜色
57 | // 我们为QPainter设置了一个笔刷(Bursh)对象并用它绘制了一个矩形。
58 | //笔刷是用于绘制形状背景的基本图形对象。
59 | qp.SetBrush2(core.Qt__Dense2Pattern)
60 | // DrawRect2()方法接受四个参数,前两个是起点的x,y坐标,后两个是矩形的宽和高。
61 | //这个方法使用当前的画笔与笔刷对象进行绘制。
62 | qp.DrawRect2(10, 15, 90, 60)
63 |
64 | qp.SetBrush2(core.Qt__Dense4Pattern)
65 | qp.DrawRect2(130, 15, 90, 60)
66 |
67 | qp.SetBrush2(core.Qt__BDiagPattern)
68 | qp.DrawRect2(250, 15, 90, 60)
69 |
70 | qp.End()
71 |
72 | })
73 | }
74 |
75 | func main() {
76 | // 创建一个应用程序对象
77 | // sys.argv参数是一个列表,从命令行输入参数
78 | widgets.NewQApplication(len(os.Args), os.Args)
79 |
80 | // 初始化主窗口
81 | app := InitMainWindow()
82 |
83 | // 初始化组件
84 | InitComponents(app)
85 |
86 | // 控制窗口显示在屏幕中心的方法
87 | center(app)
88 |
89 | // 显示主窗口
90 | app.Show()
91 |
92 | // 确保应用程序干净的退出
93 | widgets.QApplication_Exec()
94 | }
95 |
--------------------------------------------------------------------------------
/painter_draw_point/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制换行文本
2 | - 我们先以窗体内Unicode文本的绘制为例。
3 | - 换行绘制文本
4 | - 文本的包围矩形
5 | - 一般显示的宽度应该是确定的,关键是高度的计算,可以逐个字符的把他们的宽度加起来(不同的字体每个字符的宽度不一样),当大于显示的宽度就换行,高度也对应的加上一行的高度,这样就能计算出最终的高度了,也就知道了显示消息的矩形大小,使用这个方法就能自适应的显示消息了。
6 | - 虽然我们已经知道了自适应显示消息的原理,但是如果是我们自己来计算实现,难度还是不小的,其实 Qt 已经给我们提供了相关的 API,使用 QFontMetrics::boundingRect() 可以计算出包围文本的矩形,然后在用上面的方法绘制文本就可以了,下面的程序,改变窗口的宽度,能动态的计算出显示文本所有内容的包围矩形,解决了上面提到的在给定的矩形中,文本太长时显示不全的问题
7 |
8 |
9 | ## 效果展示
10 | 
11 |
12 |
--------------------------------------------------------------------------------
/painter_draw_point/go.mod:
--------------------------------------------------------------------------------
1 | module painter_draw_point
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_draw_point/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_draw_point/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_draw_point/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_draw_point/images/app.ico
--------------------------------------------------------------------------------
/painter_draw_point/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "math/rand"
5 | "os"
6 |
7 | "github.com/therecipe/qt/core"
8 | "github.com/therecipe/qt/gui"
9 | "github.com/therecipe/qt/widgets"
10 | )
11 |
12 | // 控制窗口显示在屏幕中心的方法
13 | func center(app *widgets.QMainWindow) {
14 | // 获得窗口
15 | qr := app.FrameGeometry()
16 |
17 | // 获得屏幕中心点
18 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
19 | // 显示到屏幕中心
20 | qr.MoveCenter(cp)
21 | app.Move(qr.TopLeft())
22 | }
23 |
24 | // InitMainWindow 初始化主窗口
25 | func InitMainWindow() *widgets.QMainWindow {
26 | // 创建窗口
27 | app := widgets.NewQMainWindow(nil, 0)
28 |
29 | // 设置窗口的标题
30 | app.SetWindowTitle("Qt 教程")
31 |
32 | // 设置窗口的位置和大小
33 | app.SetGeometry2(300, 300, 300, 220)
34 |
35 | // 设置窗口的图标,引用当前目录下的web.png图片
36 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
37 |
38 | return app
39 | }
40 |
41 | // InitComponents 初始化组件
42 | func InitComponents(app *widgets.QMainWindow) {
43 | // 布局窗口组件载体
44 | widget := widgets.NewQWidget(app, core.Qt__Widget)
45 | // widget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(widget)
47 |
48 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
49 | qp := gui.NewQPainter2(widget)
50 |
51 | //qp.SetPen2(core.Qt__red)
52 | //每次我们改变窗口的大小,生成一个 paint event 事件。
53 | //我们得到的当前窗口的大小size。我们使用窗口的大小来分配点在窗口的客户区。demo.go
54 | size := widget.Size()
55 |
56 | for i := 0; i < 1000; i++ {
57 | rand.Int()
58 | x := rand.Intn(size.Width() - 1)
59 | y := rand.Intn(size.Height() - 1)
60 | qp.DrawPoint3(x, y)
61 | }
62 |
63 | qp.End()
64 | })
65 | }
66 |
67 | func main() {
68 | // 创建一个应用程序对象
69 | // sys.argv参数是一个列表,从命令行输入参数
70 | widgets.NewQApplication(len(os.Args), os.Args)
71 |
72 | // 初始化主窗口
73 | app := InitMainWindow()
74 |
75 | // 初始化组件
76 | InitComponents(app)
77 |
78 | // 控制窗口显示在屏幕中心的方法
79 | center(app)
80 |
81 | // 显示主窗口
82 | app.Show()
83 |
84 | // 确保应用程序干净的退出
85 | widgets.QApplication_Exec()
86 | }
87 |
--------------------------------------------------------------------------------
/painter_pen/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-画笔QPen
2 | - QPen是一个基本的图形对象。用于绘制线条、曲线和轮廓的矩形、椭圆、多边形或其他形状。
3 | - 示例中我们画六行。线条勾勒出了六个不同的笔风格。有五个预定义的钢笔样式。
4 | - 我们也可以创建自定义的钢笔样式。最后一行使用一个定制的钢笔绘制风格。
5 |
6 |
7 | ## 效果展示
8 | 
9 |
10 |
--------------------------------------------------------------------------------
/painter_pen/go.mod:
--------------------------------------------------------------------------------
1 | module painter_pen
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_pen/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/painter_pen/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_pen/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_pen/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_pen/images/app.ico
--------------------------------------------------------------------------------
/painter_text1/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制文本1
2 | - 在我们的示例中,我们绘制一些Cylliric文本。文本垂直和水平对齐。
3 | - 相信大多 数人和我一样,刚开始的时候都认为 drawText() 的 x, y 是字符串左上角的坐标,其实不然,它是字符串的第一个字符的 origin 的坐标,y 是字体的 base line 的 y 坐标。
4 | - 本案例窗口显示文本.
5 | - 参考文章:https://blog.csdn.net/TemetNosce/article/details/78068520
6 |
7 |
8 | ## 绘图简介
9 | Qt5绘画系统能够呈现矢量图形,图像,和大纲font-based文本。
10 | 我们也可以在程序中调用系统api自定义绘图控件。
11 |
12 | 绘图要在paintEvent()方法中实现。
13 | 在QPainter对象的begin()与end()方法间编写绘图代码。
14 | 它会在控件或其他图形设备上进行低级的图形绘制。
15 |
16 | ## 效果展示
17 | 
18 |
19 |
--------------------------------------------------------------------------------
/painter_text1/go.mod:
--------------------------------------------------------------------------------
1 | module painter_text1
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_text1/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text1/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_text1/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text1/images/app.ico
--------------------------------------------------------------------------------
/painter_text1/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 | //qp.Begin(widget)
50 |
51 | qp.SetRenderHint(gui.QPainter__Antialiasing, true)
52 | // 定义一个画笔和一个字体用于绘制文本。
53 | qp.SetFont(gui.NewQFont2("Times", 100, 0, true))
54 | qp.SetPen2(gui.NewQColor3(255, 255, 255, 255))
55 |
56 | qp.DrawText3(150, 150, "jEh")
57 |
58 | // 方法将文本绘制在窗体,显示在中心
59 | qp.DrawText4(event.Rect(), int(core.QTextStream__AlignCenter), "text", widget.Rect())
60 |
61 | qp.End()
62 | })
63 | }
64 |
65 | func main() {
66 | // 创建一个应用程序对象
67 | // sys.argv参数是一个列表,从命令行输入参数
68 | widgets.NewQApplication(len(os.Args), os.Args)
69 |
70 | // 初始化主窗口
71 | app := InitMainWindow()
72 |
73 | // 初始化组件
74 | InitComponents(app)
75 |
76 | // 控制窗口显示在屏幕中心的方法
77 | center(app)
78 |
79 | // 显示主窗口
80 | app.Show()
81 |
82 | // 确保应用程序干净的退出
83 | widgets.QApplication_Exec()
84 | }
85 |
--------------------------------------------------------------------------------
/painter_text2/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制文本1
2 | - 我们先以窗体内Unicode文本的绘制为例。
3 | - 在我们的示例中,我们绘制一些Cylliric文本。文本垂直和水平对齐。
4 | - 还是原来的问题,从 widget 的左上角开始绘制文本,那么 y 就应该和 ascent 一样大,但是怎么得到 ascent 的值呢?难到需要我们记住每种字体的 ascent 的值吗?这也是一种方法,如果愿意,未尝不可,但是,脑子够用么,幸好 QFontMetrics 就能够给我们提供字体的信息,提供了很多函数,如取得 line height 用 height(),用 width() 计算字符串的宽度,ascent(), descent(), xHeight() 等, 函数的名字已经很好的表明它的作用,在此就不再一一介绍,更多的函数请参考 Qt 的帮助文档。所以为了达到我们的目的,只需要把 y = 0 修改为 int y = metrics.ascent() 就可以了:
5 | - 原文链接:https://blog.csdn.net/TemetNosce/article/details/78068520
6 |
7 |
8 | ## 效果展示
9 | 
10 |
11 |
--------------------------------------------------------------------------------
/painter_text2/go.mod:
--------------------------------------------------------------------------------
1 | module painter_text2
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_text2/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text2/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_text2/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text2/images/app.ico
--------------------------------------------------------------------------------
/painter_text2/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 |
50 | qp.SetRenderHint(gui.QPainter__Antialiasing, true)
51 | qp.SetFont(gui.NewQFont2("Times", 100, 0, true))
52 | metrics := qp.FontMetrics()
53 |
54 | y := metrics.Ascent()
55 | qp.DrawText3(0, y, "jEh")
56 | qp.End()
57 | })
58 | }
59 |
60 | func main() {
61 | // 创建一个应用程序对象
62 | // sys.argv参数是一个列表,从命令行输入参数
63 | widgets.NewQApplication(len(os.Args), os.Args)
64 |
65 | // 初始化主窗口
66 | app := InitMainWindow()
67 |
68 | // 初始化组件
69 | InitComponents(app)
70 |
71 | // 控制窗口显示在屏幕中心的方法
72 | center(app)
73 |
74 | // 显示主窗口
75 | app.Show()
76 |
77 | // 确保应用程序干净的退出
78 | widgets.QApplication_Exec()
79 | }
80 |
--------------------------------------------------------------------------------
/painter_text3/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制矩形包围文本
2 | - 我们先以窗体内Unicode文本的绘制为例。
3 | - 居中绘制文本
4 | - 有了 QFontMetrics,想必对大家来说问题已经不大,得到字符串的宽、高、ascent,简单的居中计算,就可以得到 origin 的坐标了。
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/painter_text3/go.mod:
--------------------------------------------------------------------------------
1 | module painter_text3
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_text3/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text3/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_text3/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text3/images/app.ico
--------------------------------------------------------------------------------
/painter_text3/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 |
50 | qp.SetRenderHint(gui.QPainter__Antialiasing, true)
51 | qp.SetFont(gui.NewQFont2("Times", 100, 0, true))
52 |
53 | rect := core.NewQRect4(20, 20, 300, 200)
54 | qp.DrawRect3(rect)
55 |
56 | // 居中绘制文本
57 | metrics := qp.FontMetrics()
58 |
59 | stringHeight := metrics.Ascent() + metrics.Descent() // 不算 line gap
60 | stringWidth := metrics.AverageCharWidth() // 字符串的宽度
61 | x := rect.X() + (rect.Width()-stringWidth)/2
62 | y := rect.Y() + (rect.Height()-stringHeight)/2 + metrics.Ascent()
63 | qp.DrawText3(x, y, "jEh")
64 |
65 | // 绘制字符串的包围矩形
66 | y = rect.Y() + (rect.Height()-stringHeight)/2
67 | //qp.SetPen(core.Qt__lightGray)
68 | qp.DrawRect2(x, y, stringWidth, stringHeight)
69 |
70 | // Menlo 后就可以看到确实是完全居中的,说明 QFontMetrics 得到的字体信息没问题,
71 | // 只是有的字体为了美观漂亮作了一些调整,对于这些字体如果要完全的居中效果的话,
72 | // 只好在使用上面的计算方式后再手动的微调一下就好了。
73 | qp.End()
74 | })
75 | }
76 |
77 | func main() {
78 | // 创建一个应用程序对象
79 | // sys.argv参数是一个列表,从命令行输入参数
80 | widgets.NewQApplication(len(os.Args), os.Args)
81 |
82 | // 初始化主窗口
83 | app := InitMainWindow()
84 |
85 | // 初始化组件
86 | InitComponents(app)
87 |
88 | // 控制窗口显示在屏幕中心的方法
89 | center(app)
90 |
91 | // 显示主窗口
92 | app.Show()
93 |
94 | // 确保应用程序干净的退出
95 | widgets.QApplication_Exec()
96 | }
97 |
--------------------------------------------------------------------------------
/painter_text4/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制换行文本
2 | - 我们先以窗体内Unicode文本的绘制为例。
3 | - 换行绘制文本
4 | - drawText() 绘制文本有两种方式,不会自动换行和在给定的矩形中自动换行,下面就举例说明,先绘制一行很长但不会自动换行的文本,然后在给定的矩形 QRect(20, 35, 200, 80) 里绘制会自动换行,向右靠齐的文本(发现超出矩形的字符不显示)
5 |
6 |
7 | ## 效果展示
8 | 
9 |
10 |
--------------------------------------------------------------------------------
/painter_text4/go.mod:
--------------------------------------------------------------------------------
1 | module painter_text4
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_text4/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text4/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_text4/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text4/images/app.ico
--------------------------------------------------------------------------------
/painter_text4/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 | //qp.Begin(widget)
50 |
51 | qp.SetRenderHint(gui.QPainter__Antialiasing, true)
52 |
53 | text := "QPainter provides highly optimized functions to do " +
54 | "most of the drawing GUI programs require. It can draw " +
55 | "everything from simple lines to complex shapes " +
56 | "like pies and chords. " +
57 | "看看是否也支持中文呢,如果不支持那就悲剧了!"
58 | rect := core.NewQRect4(20, 20, 300, 200)
59 | qp.DrawRect3(rect) // 画出矩形,可以看到超出此矩形的部分文本不可见
60 |
61 | //core.Qt__TextWordWrap | core.Qt__AlignRight
62 | qp.DrawText4(rect, int(core.Qt__TextWordWrap), text, rect)
63 | qp.End()
64 |
65 | })
66 | }
67 |
68 | func main() {
69 | // 创建一个应用程序对象
70 | // sys.argv参数是一个列表,从命令行输入参数
71 | widgets.NewQApplication(len(os.Args), os.Args)
72 |
73 | // 初始化主窗口
74 | app := InitMainWindow()
75 |
76 | // 初始化组件
77 | InitComponents(app)
78 |
79 | // 控制窗口显示在屏幕中心的方法
80 | center(app)
81 |
82 | // 显示主窗口
83 | app.Show()
84 |
85 | // 确保应用程序干净的退出
86 | widgets.QApplication_Exec()
87 | }
88 |
--------------------------------------------------------------------------------
/painter_text5/README.md:
--------------------------------------------------------------------------------
1 | # 绘画QPainter-绘制换行文本
2 | - 我们先以窗体内Unicode文本的绘制为例。
3 | - 换行绘制文本
4 | - 文本的包围矩形
5 | - 一般显示的宽度应该是确定的,关键是高度的计算,可以逐个字符的把他们的宽度加起来(不同的字体每个字符的宽度不一样),当大于显示的宽度就换行,高度也对应的加上一行的高度,这样就能计算出最终的高度了,也就知道了显示消息的矩形大小,使用这个方法就能自适应的显示消息了。
6 | - 虽然我们已经知道了自适应显示消息的原理,但是如果是我们自己来计算实现,难度还是不小的,其实 Qt 已经给我们提供了相关的 API,使用 QFontMetrics::boundingRect() 可以计算出包围文本的矩形,然后在用上面的方法绘制文本就可以了,下面的程序,改变窗口的宽度,能动态的计算出显示文本所有内容的包围矩形,解决了上面提到的在给定的矩形中,文本太长时显示不全的问题
7 |
8 |
9 | ## 效果展示
10 | 
11 |
12 |
--------------------------------------------------------------------------------
/painter_text5/go.mod:
--------------------------------------------------------------------------------
1 | module painter_text5
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/painter_text5/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text5/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/painter_text5/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/painter_text5/images/app.ico
--------------------------------------------------------------------------------
/painter_text5/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | // widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | widget.ConnectPaintEvent(func(event *gui.QPaintEvent) {
48 | qp := gui.NewQPainter2(widget)
49 | //qp.Begin(widget)
50 |
51 | qp.SetRenderHint(gui.QPainter__Antialiasing, true)
52 |
53 | text := "QPainter provides highly optimized functions to do " +
54 | "most of the drawing GUI programs require. It can draw " +
55 | "everything from simple lines to complex shapes " +
56 | "like pies and chords. " +
57 | "看看是否也支持中文呢,如果不支持那就悲剧了!"
58 |
59 | width := widget.Width() - 40 // 显示文本的宽度,为窗口的宽度减去 40 像素
60 | flags := int(core.Qt__TextWordWrap) // 自动换行
61 | // 计算文本在指定宽度下的包围矩形
62 | metrics := qp.FontMetrics()
63 | rect := core.NewQRect4(0, 0, width, 0)
64 | textBoundingRect := metrics.BoundingRect3(rect, flags, text, 4, 4)
65 | qp.Translate3(20, 20)
66 | qp.DrawRect3(textBoundingRect)
67 | qp.DrawText4(textBoundingRect, flags, text, rect)
68 |
69 | qp.End()
70 |
71 | })
72 | }
73 |
74 | func main() {
75 | // 创建一个应用程序对象
76 | // sys.argv参数是一个列表,从命令行输入参数
77 | widgets.NewQApplication(len(os.Args), os.Args)
78 |
79 | // 初始化主窗口
80 | app := InitMainWindow()
81 |
82 | // 初始化组件
83 | InitComponents(app)
84 |
85 | // 控制窗口显示在屏幕中心的方法
86 | center(app)
87 |
88 | // 显示主窗口
89 | app.Show()
90 |
91 | // 确保应用程序干净的退出
92 | widgets.QApplication_Exec()
93 | }
94 |
--------------------------------------------------------------------------------
/password_input_dialog/README.md:
--------------------------------------------------------------------------------
1 | # 密码输入对话框QInputDialog
2 | - 创建一个按钮,绑定一个事件;
3 | - 创建一个文本框
4 | - 点击按钮,弹出一个密码输入对话框,并将数据传送给文本框
5 |
6 |
7 | ## 效果展示
8 |
9 |
--------------------------------------------------------------------------------
/password_input_dialog/go.mod:
--------------------------------------------------------------------------------
1 | module password_input_dialog
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/password_input_dialog/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/password_input_dialog/images/app.ico
--------------------------------------------------------------------------------
/password_input_dialog/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | btn := widgets.NewQPushButton2("Dialog", widget)
48 | btn.Move2(20, 20)
49 |
50 | le := widgets.NewQLineEdit(widget)
51 | le.Move2(130, 22)
52 |
53 | btn.ConnectClicked(func(checked bool) {
54 | ok := false
55 | input := widgets.NewQInputDialog(widget, core.Qt__Widget)
56 | text := input.GetText(
57 | widget,
58 | "Input Dialog",
59 | "Enter your name:",
60 | widgets.QLineEdit__Password,
61 | "",
62 | &ok,
63 | core.Qt__Widget,
64 | core.Qt__ImhNone,
65 | )
66 | // 对话框收到的文本消息会显示在文本框中
67 | if ok {
68 | le.SetText(text)
69 | }
70 | })
71 |
72 | }
73 |
74 | func main() {
75 | // 创建一个应用程序对象
76 | // sys.argv参数是一个列表,从命令行输入参数
77 | widgets.NewQApplication(len(os.Args), os.Args)
78 |
79 | // 初始化主窗口
80 | app := InitMainWindow()
81 |
82 | // 初始化组件
83 | InitComponents(app)
84 |
85 | // 控制窗口显示在屏幕中心的方法
86 | center(app)
87 |
88 | // 显示主窗口
89 | app.Show()
90 |
91 | // 确保应用程序干净的退出
92 | widgets.QApplication_Exec()
93 | }
94 |
--------------------------------------------------------------------------------
/pixmap/README.md:
--------------------------------------------------------------------------------
1 | # 图像显示设计QPixmap
2 | - QPixmap是用于处理图像的控件。是优化的显示图像在屏幕上。
3 | - 在我们的代码示例中,我们将使用QPixmap窗口显示一个图像。
4 |
5 |
6 | ## 效果展示
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/pixmap/go.mod:
--------------------------------------------------------------------------------
1 | module pixmap
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/pixmap/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/pixmap/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/pixmap/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/pixmap/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/pixmap/images/app.ico
--------------------------------------------------------------------------------
/pixmap/images/landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/pixmap/images/landscape.png
--------------------------------------------------------------------------------
/pixmap/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | // 水平布局
48 | hbox := widgets.NewQHBoxLayout2(widget)
49 | pixmap := gui.NewQPixmap3("images/landscape.png", "", core.Qt__AutoColor)
50 |
51 | // 标签组件demo.go
52 | label := widgets.NewQLabel(widget, core.Qt__Widget)
53 | label.SetScaledContents(true)
54 |
55 | label.SetPixmap(pixmap)
56 |
57 | hbox.AddWidget(label, 0, core.Qt__AlignLeft)
58 | }
59 |
60 | func main() {
61 | // 创建一个应用程序对象
62 | // sys.argv参数是一个列表,从命令行输入参数
63 | widgets.NewQApplication(len(os.Args), os.Args)
64 |
65 | // 初始化主窗口
66 | app := InitMainWindow()
67 |
68 | // 初始化组件
69 | InitComponents(app)
70 |
71 | // 控制窗口显示在屏幕中心的方法
72 | center(app)
73 |
74 | // 显示主窗口
75 | app.Show()
76 |
77 | // 确保应用程序干净的退出
78 | widgets.QApplication_Exec()
79 | }
80 |
--------------------------------------------------------------------------------
/progress_bar/README.md:
--------------------------------------------------------------------------------
1 | # 进度条QProgressBar
2 | - 一个进度条是一个显示任务进展的控件。
3 | - QProgressBar控件提供了一个水平或垂直Qt5工具包的进度条。
4 | - 程序员可以设置进度条的最小和最大值。默认值是0到99。
5 | - 这个例子显示一个水平的进度条和一个按钮,用户通过点击按钮开始和停止进度条
6 |
7 |
8 |
9 | ## 效果展示
10 | 
11 |
12 |
--------------------------------------------------------------------------------
/progress_bar/go.mod:
--------------------------------------------------------------------------------
1 | module progress_bar
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/progress_bar/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/progress_bar/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/progress_bar/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/progress_bar/images/app.ico
--------------------------------------------------------------------------------
/progress_bar/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | // 进度条
48 | pbar := widgets.NewQProgressBar(widget)
49 | pbar.SetGeometry2(30, 40, 200, 25)
50 | pbar.SetValue(0)
51 |
52 | btn := widgets.NewQPushButton2("Start", widget)
53 | btn.Move2(40, 80)
54 |
55 | // 计数
56 | step := 0
57 |
58 | // 定时器,我们使用定时器timer来激活QProgressBar
59 | // timer := core.NewQBasicTimer()
60 | timer := core.NewQTimer(widget)
61 | // 每个QObject及其子类都有一个timerEvent()事件处理器。
62 | //我们要重新实现这个事件处理器来响应定时器事件。
63 | timer.ConnectEvent(func(e *core.QEvent) bool {
64 | if step >= 100 {
65 | timer.Stop()
66 | btn.SetText("Finished")
67 | return true
68 | } else {
69 | step = step + 1
70 | pbar.SetValue(step)
71 | }
72 | return false
73 | })
74 |
75 | //方法中启动/停止定时器。
76 | btn.ConnectClicked(func(checked bool) {
77 | if timer.IsActive() {
78 | timer.Stop()
79 | btn.SetText("Start")
80 | } else {
81 | //我们调用start()方法启动一个计时器。这个方法有两个参数:超时和对象将接收的事件。
82 | timer.Start(100)
83 | btn.SetText("Stop")
84 | }
85 |
86 | })
87 | }
88 |
89 | func main() {
90 | // 创建一个应用程序对象
91 | // sys.argv参数是一个列表,从命令行输入参数
92 | widgets.NewQApplication(len(os.Args), os.Args)
93 |
94 | // 初始化主窗口
95 | app := InitMainWindow()
96 |
97 | // 初始化组件
98 | InitComponents(app)
99 |
100 | // 控制窗口显示在屏幕中心的方法
101 | center(app)
102 |
103 | // 显示主窗口
104 | app.Show()
105 |
106 | // 确保应用程序干净的退出
107 | widgets.QApplication_Exec()
108 | }
109 |
--------------------------------------------------------------------------------
/qt_oop_struct/README.md:
--------------------------------------------------------------------------------
1 | # Qt与面向对象开发
2 | - 通过结构体实现面向对面开发。
3 |
4 |
5 | ## 效果展示
6 | 
7 |
8 |
--------------------------------------------------------------------------------
/qt_oop_struct/go.mod:
--------------------------------------------------------------------------------
1 | module qt_oop_struct
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/qt_oop_struct/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/qt_oop_struct/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/qt_oop_struct/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/qt_oop_struct/images/app.ico
--------------------------------------------------------------------------------
/screen_center/README.md:
--------------------------------------------------------------------------------
1 | # 窗口显示在屏幕中心
2 | 创建一个空白窗口,并显示在屏幕的中心位置。
3 |
4 | ## 效果展示
5 | 
6 |
7 |
--------------------------------------------------------------------------------
/screen_center/go.mod:
--------------------------------------------------------------------------------
1 | module screen_center
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/screen_center/images/2023-08-05_17-55.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/screen_center/images/2023-08-05_17-55.png
--------------------------------------------------------------------------------
/screen_center/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/screen_center/images/app.ico
--------------------------------------------------------------------------------
/screen_center/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | return app
37 | }
38 |
39 | func main() {
40 | // 创建一个应用程序对象
41 | // sys.argv参数是一个列表,从命令行输入参数
42 | widgets.NewQApplication(len(os.Args), os.Args)
43 |
44 | // 初始化主窗口
45 | app := InitMainWindow()
46 |
47 | // 控制窗口显示在屏幕中心的方法
48 | center(app)
49 |
50 | // 显示主窗口
51 | app.Show()
52 |
53 | // 确保应用程序干净的退出
54 | widgets.QApplication_Exec()
55 | }
56 |
--------------------------------------------------------------------------------
/signal_slot/README.md:
--------------------------------------------------------------------------------
1 | # 信号槽
2 | - 这是一个使用信号槽的Qt5例子。
3 | - 这个例子中展示了一个QtGui.QLCDNumber和QtGui.QSlider。lcd的值会随着滑块的拖动而改变。
4 | - 在这里我们将滚动条的valueChanged信号连接到lcd的display插槽。
5 | - sender 是发出信号的对象。receiver 是接收信号的对象。
6 | - slot(插槽)是对信号做出反应的方法。
7 |
8 | ## 事件和信号介绍
9 | ### 事件 Event
10 | - 所有的组件都是事件驱动的。
11 | - 事件主要由用户触发,但也可能有其他触发方式:
12 | - 例如网络连接、window manager或定时器。
13 | - 当我们调用QApplication的exec_()方法时会使程序进入主循环。
14 | - 主循环会获取并分发事件。
15 |
16 | ### 在事件模型中,有三个参与者:
17 | - 事件源:事件源是状态发生变化的对象,它会生成事件。
18 | - 事件对象:事件(对象)封装了事件源中状态的变动。
19 | - 事件接收者:事件接收者是要通知的对象。事件源对象将事件处理的工作交给事件接收者。
20 |
21 | ## Qt信号槽
22 | - Qt有一个独特的signal&slot(信号槽)机制来处理事件。
23 | - 信号槽用于对象间的通信。
24 | - signal在某一特定事件发生时被触发,slot可以是任何callable对象。
25 | - 当signal触发时会调用与之相连的slot。
26 |
27 |
28 | ## 效果展示
29 | 
30 |
31 |
--------------------------------------------------------------------------------
/signal_slot/go.mod:
--------------------------------------------------------------------------------
1 | module signal_slot
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/signal_slot/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/signal_slot/images/2023-08-05_17-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/signal_slot/images/2023-08-05_17-57.png
--------------------------------------------------------------------------------
/signal_slot/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/signal_slot/images/app.ico
--------------------------------------------------------------------------------
/signal_slot/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件
43 | layoutWidget := widgets.NewQWidget(app, core.Qt__Widget)
44 | layoutWidget.SetGeometry2(0, 0, 300, 220)
45 |
46 | // sender 数字
47 | lcd := widgets.NewQLCDNumber(layoutWidget)
48 | // receiver 滑块
49 | sld := widgets.NewQSlider2(core.Qt__Horizontal, layoutWidget)
50 | // 设置最大值
51 | sld.SetMaximum(100)
52 |
53 | // slot 信号连接槽
54 | sld.ConnectValueChanged(func(value int) {
55 | lcd.Display2(value)
56 | })
57 |
58 | vbox := widgets.NewQVBoxLayout2(layoutWidget)
59 | vbox.AddWidget(lcd, 0, core.Qt__AlignLeft)
60 | vbox.AddWidget(sld, 0, core.Qt__AlignLeft)
61 | }
62 |
63 | func main() {
64 | // 创建一个应用程序对象
65 | // sys.argv参数是一个列表,从命令行输入参数
66 | widgets.NewQApplication(len(os.Args), os.Args)
67 |
68 | // 初始化主窗口
69 | app := InitMainWindow()
70 |
71 | // 初始化组件
72 | InitComponents(app)
73 |
74 | // 控制窗口显示在屏幕中心的方法
75 | center(app)
76 |
77 | // 显示主窗口
78 | app.Show()
79 |
80 | // 确保应用程序干净的退出
81 | widgets.QApplication_Exec()
82 | }
83 |
--------------------------------------------------------------------------------
/simple_drag/README.md:
--------------------------------------------------------------------------------
1 | # 简单拖拽Drag
2 | - 在之前示例中,我们有一个QLineEdit QPushButton。
3 | - 我们拖着纯文本的行编辑窗口小部件,然后放到按钮部件。按钮的标签会改变。
4 | - 这个列子演示了一个简单的拖拽操作
5 |
6 |
7 | ## 拖拽简介
8 | 在这部分Qt5教程中,我们将讨论拖拽相关操作。
9 |
10 | 在计算机图形用户界面中,拖放的操作(或支持的作用)点击虚拟对象和拖动到另一个位置或到另一个虚拟对象。一般来说,它可以用于调用多种行动,或创建各种类型的两个抽象对象之间的关联。
11 |
12 | 拖放是图形用户界面的一部分。拖拽操作让用户直观地做复杂的事情。
13 |
14 | 通常,我们可以拖放两件事:数据或一些图形对象。
15 | 如果我们把一个图像从一个应用程序到另一个地方,我们拖拽二进制数据。
16 | 如果我们把一个标签在Firefox中并将其移动到另一个地方,我们拖拽一个图形组件。
17 |
18 |
19 | ## 效果展示
20 | 
21 |
22 |
--------------------------------------------------------------------------------
/simple_drag/go.mod:
--------------------------------------------------------------------------------
1 | module simple_drag
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/simple_drag/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/simple_drag/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/simple_drag/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/simple_drag/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/simple_drag/images/app.ico
--------------------------------------------------------------------------------
/simple_drag/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/core"
8 | "github.com/therecipe/qt/gui"
9 | "github.com/therecipe/qt/widgets"
10 | )
11 |
12 | // 控制窗口显示在屏幕中心的方法
13 | func center(app *widgets.QMainWindow) {
14 | // 获得窗口
15 | qr := app.FrameGeometry()
16 |
17 | // 获得屏幕中心点
18 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
19 | // 显示到屏幕中心
20 | qr.MoveCenter(cp)
21 | app.Move(qr.TopLeft())
22 | }
23 |
24 | // InitMainWindow 初始化主窗口
25 | func InitMainWindow() *widgets.QMainWindow {
26 | // 创建窗口
27 | app := widgets.NewQMainWindow(nil, 0)
28 |
29 | // 设置窗口的标题
30 | app.SetWindowTitle("Qt 教程")
31 |
32 | // 设置窗口的位置和大小
33 | app.SetGeometry2(300, 300, 300, 220)
34 |
35 | // 设置窗口的图标,引用当前目录下的web.png图片
36 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
37 |
38 | return app
39 | }
40 |
41 | // InitComponents 初始化组件
42 | func InitComponents(app *widgets.QMainWindow) {
43 | // 布局窗口组件载体
44 | widget := widgets.NewQWidget(app, core.Qt__Widget)
45 | widget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(widget)
47 |
48 | //QLineEdit内置了对drag(拖动)操作的支持。
49 | edit := widgets.NewQLineEdit(widget)
50 | // 打开拖放
51 | edit.SetDragEnabled(true)
52 | edit.Move2(30, 65)
53 | edit.ConnectDropEvent(func(event *gui.QDropEvent) {
54 | fmt.Println(event.MimeData().Text())
55 | edit.SetText(event.MimeData().Text())
56 | })
57 |
58 | // 我们需要重新实现某些方法才能使QPushButton接受拖放操作。
59 | button := widgets.NewQPushButton2("Button", widget)
60 | button.Move2(190, 65)
61 | // 使该控件接受drop(放下)事件。
62 | button.SetAcceptDrops(true)
63 | button.ConnectDragEnterEvent(dragEnterEvent)
64 | // 通过重新实现dropEvent()方法,我们定义了在drop事件发生时的行为。
65 | //这里我们改变了按钮的文字。
66 | button.ConnectDropEvent(func(event *gui.QDropEvent) {
67 | fmt.Println(event.MimeData().Text())
68 | button.SetText(event.MimeData().Text())
69 | })
70 | }
71 |
72 | // 首先我们重新实现了dragEnterEvent()方法,并设置可接受的数据类型(在这里是普通文本)。
73 | func dragEnterEvent(event *gui.QDragEnterEvent) {
74 | if event.MimeData().HasFormat("text/plain") {
75 | event.AcceptProposedAction()
76 | }
77 | }
78 |
79 | func main() {
80 | // 创建一个应用程序对象
81 | // sys.argv参数是一个列表,从命令行输入参数
82 | widgets.NewQApplication(len(os.Args), os.Args)
83 |
84 | // 初始化主窗口
85 | app := InitMainWindow()
86 |
87 | // 初始化组件
88 | InitComponents(app)
89 |
90 | // 控制窗口显示在屏幕中心的方法
91 | center(app)
92 |
93 | // 显示主窗口
94 | app.Show()
95 |
96 | // 确保应用程序干净的退出
97 | widgets.QApplication_Exec()
98 | }
99 |
--------------------------------------------------------------------------------
/simple_drag_button/README.md:
--------------------------------------------------------------------------------
1 | # 拖拽按钮Drag
2 | - 在下面的示例中我们将演示如何对一个按钮控件进行拖放。
3 | - 在窗口显示一个QPushButton 。
4 | - 如果用鼠标左键点击这个按钮会在控制台中输出’press’消息。鼠标右击进行拖动。
5 |
6 |
7 | ## 效果展示
8 | 
9 |
10 |
--------------------------------------------------------------------------------
/simple_drag_button/go.mod:
--------------------------------------------------------------------------------
1 | module simple_drag_button
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/simple_drag_button/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/simple_drag_button/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/simple_drag_button/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/simple_drag_button/images/app.ico
--------------------------------------------------------------------------------
/slider/README.md:
--------------------------------------------------------------------------------
1 | # 滑动条QSlider
2 | - QSlider是一个带有简单滑块的控件。滑块可以前后拖动。我们可以通过拖动选择一个特定的值。
3 | - 有时使用滑动条比直接输入数字或使用旋转框更加自然。
4 | - 在下面的例子中,我们会显示一个滑动条与一个标签,标签用于显示图片,并通过滑动条控件图片的显示 。
5 | - 注意这里图片只能用ico格式的,png格式图片会显示不了。
6 | - 例子中我们模拟了一个音量控制。通过拖动滑块来改变标签上的图像。
7 |
8 | ## 效果展示
9 | 
--------------------------------------------------------------------------------
/slider/go.mod:
--------------------------------------------------------------------------------
1 | module slider
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/slider/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/slider/images/2023-08-06_13-36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/2023-08-06_13-36.png
--------------------------------------------------------------------------------
/slider/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/app.ico
--------------------------------------------------------------------------------
/slider/images/audio-high.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/audio-high.png
--------------------------------------------------------------------------------
/slider/images/audio-low.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/audio-low.png
--------------------------------------------------------------------------------
/slider/images/audio-mid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/audio-mid.png
--------------------------------------------------------------------------------
/slider/images/audio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/slider/images/audio.png
--------------------------------------------------------------------------------
/splitter/README.md:
--------------------------------------------------------------------------------
1 | # 分割窗口QSplitter
2 | - 通过QSplitter,用户可以拖动子控件边界来调整子控件的尺寸。
3 | - 在下面的示例中,我们展示了三个由两个QSplitter组织的QFrame控件。
4 | - 示例中我们创建了三个QFrame与两个QSplitter。
5 | - 注意在某些主题中这些QSplitter可能会不可见。
6 |
7 | ## 效果展示
8 | 
9 |
10 |
--------------------------------------------------------------------------------
/splitter/go.mod:
--------------------------------------------------------------------------------
1 | module splitter
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/splitter/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/splitter/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/splitter/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/splitter/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/splitter/images/app.ico
--------------------------------------------------------------------------------
/statusbar/README.md:
--------------------------------------------------------------------------------
1 | # 菜单栏
2 | - 菜单栏是常见的窗口应用程序的一部分。
3 | - 这个例子,菜单将终止应用程序。
4 | - Ctrl+Q的行动是可访问的快捷方式。
5 |
6 |
7 |
8 | ## 效果展示
9 | 
10 |
11 |
--------------------------------------------------------------------------------
/statusbar/go.mod:
--------------------------------------------------------------------------------
1 | module statusbar
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/statusbar/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/statusbar/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/statusbar/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/statusbar/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/statusbar/images/app.ico
--------------------------------------------------------------------------------
/statusbar/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | return app
37 | }
38 |
39 | // InitComponents 初始化组件
40 | func InitComponents(app *widgets.QMainWindow) {
41 | // 状态栏
42 | //timeout: 显示时间, -1: 一直显示
43 | app.StatusBar().ShowMessage("Ready", -1)
44 | // app.StatusBar().ShowMessage("Ready", 5)
45 | }
46 |
47 | func main() {
48 | // 创建一个应用程序对象
49 | // sys.argv参数是一个列表,从命令行输入参数
50 | widgets.NewQApplication(len(os.Args), os.Args)
51 |
52 | // 初始化主窗口
53 | app := InitMainWindow()
54 |
55 | // 初始化组件
56 | InitComponents(app)
57 |
58 | // 控制窗口显示在屏幕中心的方法
59 | center(app)
60 |
61 | // 显示主窗口
62 | app.Show()
63 |
64 | // 确保应用程序干净的退出
65 | widgets.QApplication_Exec()
66 | }
67 |
--------------------------------------------------------------------------------
/tip/README.md:
--------------------------------------------------------------------------------
1 | # 显示组件提示语
2 | 创建一个按钮,将鼠标放在按钮上会显示出提示语。
3 |
4 |
5 | ## 效果展示
6 | 
7 |
8 |
--------------------------------------------------------------------------------
/tip/go.mod:
--------------------------------------------------------------------------------
1 | module tip
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/tip/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/tip/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/tip/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/tip/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/tip/images/app.ico
--------------------------------------------------------------------------------
/tip/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 添加一个按钮
43 | // btn := widgets.NewQPushButton(app)
44 | // 设置按钮内容
45 | //btn.SetText("关闭按钮")
46 | btn := widgets.NewQPushButton2("关闭按钮", app)
47 | // 设置按钮大小
48 | // btn.SizeHint() 显示默认尺寸
49 | btn.Resize(btn.SizeHint())
50 | // 提示信息
51 | btn.SetToolTip("This is a QPushButton widget")
52 | // 设置按钮位置
53 | btn.Move2(50, 50)
54 | // 设置按钮触发,触发退出程序
55 | btn.ConnectClicked(func(checked bool) {
56 | fmt.Println("关闭窗口")
57 | app.Close()
58 | })
59 |
60 | btn.Show()
61 | }
62 |
63 | func main() {
64 | // 创建一个应用程序对象
65 | // sys.argv参数是一个列表,从命令行输入参数
66 | widgets.NewQApplication(len(os.Args), os.Args)
67 |
68 | // 初始化主窗口
69 | app := InitMainWindow()
70 |
71 | // 初始化组件
72 | InitComponents(app)
73 |
74 | // 控制窗口显示在屏幕中心的方法
75 | center(app)
76 |
77 | // 显示主窗口
78 | app.Show()
79 |
80 | // 确保应用程序干净的退出
81 | widgets.QApplication_Exec()
82 | }
83 |
--------------------------------------------------------------------------------
/toggle_button/README.md:
--------------------------------------------------------------------------------
1 | # 开关按钮ToggleButton
2 | - ToggleButton是QPushButton的一种特殊模式。
3 | - 它是一个有两种状态的按钮:按下与未按下。
4 | - 通过点击在这两种状态间来回切换。这种功能在某些场景会很实用。
5 | - 代码中我们创建了三个ToggleButton与一个QWidget。
6 | - 我们将QWidget的背景色设为黑色。
7 | - ToggleButton会切换颜色值中的红色、绿色与蓝色部分。
8 | - QWidget的背景颜色依赖于按下的按钮。
9 |
10 |
11 | ## 效果展示
12 | 
--------------------------------------------------------------------------------
/toggle_button/go.mod:
--------------------------------------------------------------------------------
1 | module toggle_button
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/toggle_button/images/2023-08-06_13-00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/toggle_button/images/2023-08-06_13-00.png
--------------------------------------------------------------------------------
/toggle_button/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/toggle_button/images/app.ico
--------------------------------------------------------------------------------
/toolbar/README.md:
--------------------------------------------------------------------------------
1 | # 工具栏
2 | - 工具栏提供了一个快速访问的入口。
3 | - 在例子中,我们创建一个简单的工具栏。工具栏有有一个按钮,点击关闭窗口。
4 | - 我们创建一个QAction事件。
5 | - 该事件有一个标签、图标和快捷键,退出窗口的方法。
6 |
7 |
8 |
9 | ## 效果展示
10 | 
11 |
12 |
--------------------------------------------------------------------------------
/toolbar/go.mod:
--------------------------------------------------------------------------------
1 | module toolbar
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/toolbar/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/toolbar/images/2023-08-05_18-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/toolbar/images/2023-08-05_18-10.png
--------------------------------------------------------------------------------
/toolbar/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/toolbar/images/app.ico
--------------------------------------------------------------------------------
/toolbar/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/gui"
7 | "github.com/therecipe/qt/widgets"
8 | )
9 |
10 | // 控制窗口显示在屏幕中心的方法
11 | func center(app *widgets.QMainWindow) {
12 | // 获得窗口
13 | qr := app.FrameGeometry()
14 |
15 | // 获得屏幕中心点
16 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
17 | // 显示到屏幕中心
18 | qr.MoveCenter(cp)
19 | app.Move(qr.TopLeft())
20 | }
21 |
22 | // InitMainWindow 初始化主窗口
23 | func InitMainWindow() *widgets.QMainWindow {
24 | // 创建窗口
25 | app := widgets.NewQMainWindow(nil, 0)
26 |
27 | // 设置窗口的标题
28 | app.SetWindowTitle("Qt 教程")
29 |
30 | // 设置窗口的位置和大小
31 | app.SetGeometry2(300, 300, 300, 220)
32 |
33 | // 设置窗口的图标,引用当前目录下的web.png图片
34 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
35 |
36 | // 状态栏
37 | //timeout: 显示时间, -1: 一直显示
38 | app.StatusBar().ShowMessage("Ready", -1)
39 | // app.StatusBar().ShowMessage("Ready", 5)
40 |
41 | return app
42 | }
43 |
44 | // InitComponents 初始化组件
45 | func InitComponents(app *widgets.QMainWindow) {
46 | // 退出操作
47 | exitAction := widgets.NewQAction3(gui.NewQIcon5("images/app.ico"), "&Exit", nil)
48 | // 快捷键,自定义
49 | exitAction.SetShortcut(gui.NewQKeySequence2("Ctrl+Q", gui.QKeySequence__NativeText))
50 | // 提示语
51 | exitAction.SetStatusTip("Exit application")
52 | // 事件触发
53 | exitAction.ConnectTriggered(func(checked bool) {
54 | app.Close()
55 | })
56 |
57 | actions := widgets.NewQActionGroup(app)
58 | actions.AddAction(exitAction)
59 |
60 | // 创建工具栏
61 | // toolbar := widgets.NewQToolBar("Exit", app)
62 | toolbar := app.AddToolBar3("Tools")
63 | toolbar.AddActions(actions.Actions())
64 | }
65 |
66 | func main() {
67 | // 创建一个应用程序对象
68 | // sys.argv参数是一个列表,从命令行输入参数
69 | widgets.NewQApplication(len(os.Args), os.Args)
70 |
71 | // 初始化主窗口
72 | app := InitMainWindow()
73 |
74 | // 初始化组件
75 | InitComponents(app)
76 |
77 | // 控制窗口显示在屏幕中心的方法
78 | center(app)
79 |
80 | // 显示主窗口
81 | app.Show()
82 |
83 | // 确保应用程序干净的退出
84 | widgets.QApplication_Exec()
85 | }
86 |
--------------------------------------------------------------------------------
/toolbar_and_statusbar/README.md:
--------------------------------------------------------------------------------
1 | # 工具栏和状态栏综合
2 | - 创建了一个窗口
3 | - 我们创建了一个QTextEdit,并把他设置为窗口的布局
4 | - 创建一个菜单栏,一个工具栏,都拥有一个点击事件。
5 | - 注意:当期案例无法共享action
6 |
7 |
8 | ## 效果展示
9 |
10 |
--------------------------------------------------------------------------------
/toolbar_and_statusbar/go.mod:
--------------------------------------------------------------------------------
1 | module toolbar_and_statusbar
2 |
3 | go 1.20
4 |
5 | require github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
6 |
7 | require github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
8 |
--------------------------------------------------------------------------------
/toolbar_and_statusbar/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/toolbar_and_statusbar/images/app.ico
--------------------------------------------------------------------------------
/toolbar_and_statusbar/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 |
6 | "github.com/therecipe/qt/core"
7 | "github.com/therecipe/qt/gui"
8 | "github.com/therecipe/qt/widgets"
9 | )
10 |
11 | // 控制窗口显示在屏幕中心的方法
12 | func center(app *widgets.QMainWindow) {
13 | // 获得窗口
14 | qr := app.FrameGeometry()
15 |
16 | // 获得屏幕中心点
17 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
18 | // 显示到屏幕中心
19 | qr.MoveCenter(cp)
20 | app.Move(qr.TopLeft())
21 | }
22 |
23 | // InitMainWindow 初始化主窗口
24 | func InitMainWindow() *widgets.QMainWindow {
25 | // 创建窗口
26 | app := widgets.NewQMainWindow(nil, 0)
27 |
28 | // 设置窗口的标题
29 | app.SetWindowTitle("Qt 教程")
30 |
31 | // 设置窗口的位置和大小
32 | app.SetGeometry2(300, 300, 300, 220)
33 |
34 | // 设置窗口的图标,引用当前目录下的web.png图片
35 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
36 |
37 | return app
38 | }
39 |
40 | // InitComponents 初始化组件
41 | func InitComponents(app *widgets.QMainWindow) {
42 | // 布局窗口组件载体
43 | widget := widgets.NewQWidget(app, core.Qt__Widget)
44 | widget.SetGeometry2(0, 0, 300, 220)
45 | app.SetCentralWidget(widget)
46 |
47 | textEdit := widgets.NewQTextEdit(widget)
48 | textEdit.Resize2(300, 200)
49 |
50 | // 退出操作
51 | exitAction := widgets.NewQAction3(gui.NewQIcon5("images/app.ico"), "&Exit", nil)
52 | // 快捷键,自定义
53 | exitAction.SetShortcut(gui.NewQKeySequence2("Ctrl+Q", gui.QKeySequence__NativeText))
54 | // 提示语
55 | exitAction.SetStatusTip("Exit application")
56 | // 事件触发
57 | exitAction.ConnectTriggered(func(checked bool) {
58 | app.Close()
59 | })
60 |
61 | actions := widgets.NewQActionGroup(app)
62 | actions.AddAction(exitAction)
63 |
64 | //创建一个菜单栏
65 | // menubar := widgets.NewQMenuBar(app)
66 | menubar := app.MenuBar()
67 | // 添加菜单
68 | fileMenu := menubar.AddMenu2("&File")
69 | // 添加按钮
70 | fileMenu.AddActions(actions.Actions())
71 |
72 | // 创建工具栏
73 | // toolbar := widgets.NewQToolBar("Exit", app)
74 | toolbar := app.AddToolBar3("Exit")
75 | toolbar.AddActions(actions.Actions())
76 | }
77 |
78 | func main() {
79 | // 创建一个应用程序对象
80 | // sys.argv参数是一个列表,从命令行输入参数
81 | widgets.NewQApplication(len(os.Args), os.Args)
82 |
83 | // 初始化主窗口
84 | app := InitMainWindow()
85 |
86 | // 初始化组件
87 | InitComponents(app)
88 |
89 | // 控制窗口显示在屏幕中心的方法
90 | center(app)
91 |
92 | // 显示主窗口
93 | app.Show()
94 |
95 | // 确保应用程序干净的退出
96 | widgets.QApplication_Exec()
97 | }
98 |
--------------------------------------------------------------------------------
/ui_loader/README.md:
--------------------------------------------------------------------------------
1 | # 加载UI文件QUiLoader
2 | - 直接使用QUiLoader加载untitled.ui文件,加速开发速度。
3 |
4 |
5 | ## qt creator IDE
6 | 可以使用 qt creator IDE 可视化布局,生成UI文件。
7 |
8 | ## 效果展示
9 |
10 |
--------------------------------------------------------------------------------
/ui_loader/go.mod:
--------------------------------------------------------------------------------
1 | module ui_loader
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/ui_loader/go.sum:
--------------------------------------------------------------------------------
1 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e h1:XWcjeEtTFTOVA9Fs1w7n2XBftk5ib4oZrhzWk0B+3eA=
4 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
5 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
6 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
7 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
9 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
10 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
11 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
12 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
13 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
14 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o=
15 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us=
16 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
17 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
18 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
19 | golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
20 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
21 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
22 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
23 | golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
25 | golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
26 |
--------------------------------------------------------------------------------
/ui_loader/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/ui_loader/images/app.ico
--------------------------------------------------------------------------------
/ui_loader/untitled.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | MainWindow
4 |
5 |
6 |
7 | 0
8 | 0
9 | 532
10 | 344
11 |
12 |
13 |
14 | MainWindow
15 |
16 |
17 |
18 |
19 |
20 | 80
21 | 100
22 | 80
23 | 26
24 |
25 |
26 |
27 | 默认按钮
28 |
29 |
30 |
31 |
32 |
33 | 230
34 | 100
35 | 151
36 | 41
37 |
38 |
39 |
40 | 这是默认文本
41 |
42 |
43 |
44 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/widget_sender_receiver/README.md:
--------------------------------------------------------------------------------
1 | # 发出信号与接收信号
2 | - 有时需要知道信号是由哪个控件发出的。对此Qt5提供了sender()方法。
3 | - 我们创建了两个按钮。
4 | - 我们通过调用sender()方法来判断信号源, 并将其名称显示在窗体的状态栏中。
5 | - 注意: `当前linux输出问空`
6 |
7 |
8 |
9 | ## qt编译
10 | ```
11 | go mod vendor
12 |
13 | GOWORK=off qtdeploy -fast test desktop
14 | ```
15 |
16 | ## 效果展示
17 |
18 |
--------------------------------------------------------------------------------
/widget_sender_receiver/go.mod:
--------------------------------------------------------------------------------
1 | module widget_sender_receiver
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/widget_sender_receiver/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/widget_sender_receiver/images/app.ico
--------------------------------------------------------------------------------
/widget_sender_receiver2/README.md:
--------------------------------------------------------------------------------
1 | # 自定义按键事件处理器
2 | - 有时需要知道信号是由哪个控件发出的。对此Qt5提供了sender()方法。
3 | - 我们创建了两个按钮。
4 | - 我们通过调用sender()方法来判断信号源, 并将其名称显示在窗体的状态栏中。
5 | - 通过传入按钮对象进行判断
6 |
7 |
8 |
9 | ## qt编译
10 | ```
11 | go mod vendor
12 |
13 | GOWORK=off qtdeploy -fast test desktop
14 | ```
15 |
16 | ## 效果展示
17 | 
18 |
19 |
--------------------------------------------------------------------------------
/widget_sender_receiver2/go.mod:
--------------------------------------------------------------------------------
1 | module widget_sender_receiver2
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/gopherjs/gopherjs v0.0.0-20190411002643-bd77b112433e // indirect
7 | github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d
8 | )
9 |
--------------------------------------------------------------------------------
/widget_sender_receiver2/images/2023-08-05_17-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/widget_sender_receiver2/images/2023-08-05_17-57.png
--------------------------------------------------------------------------------
/widget_sender_receiver2/images/app.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/silent-rain/qt-tutorial/048634a4b4bb12b30dee20b00511d26c428138c2/widget_sender_receiver2/images/app.ico
--------------------------------------------------------------------------------
/widget_sender_receiver2/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/therecipe/qt/core"
8 | "github.com/therecipe/qt/gui"
9 | "github.com/therecipe/qt/widgets"
10 | )
11 |
12 | // 控制窗口显示在屏幕中心的方法
13 | func center(app *widgets.QMainWindow) {
14 | // 获得窗口
15 | qr := app.FrameGeometry()
16 |
17 | // 获得屏幕中心点
18 | cp := widgets.NewQDesktopWidget().AvailableGeometry2(app).Center()
19 | // 显示到屏幕中心
20 | qr.MoveCenter(cp)
21 | app.Move(qr.TopLeft())
22 | }
23 |
24 | // InitMainWindow 初始化主窗口
25 | func InitMainWindow() *widgets.QMainWindow {
26 | // 创建窗口
27 | app := widgets.NewQMainWindow(nil, 0)
28 |
29 | // 设置窗口的标题
30 | app.SetWindowTitle("Qt 教程")
31 |
32 | // 设置窗口的位置和大小
33 | app.SetGeometry2(300, 300, 300, 220)
34 |
35 | // 设置窗口的图标,引用当前目录下的web.png图片
36 | app.SetWindowIcon(gui.NewQIcon5("images/app.ico"))
37 |
38 | return app
39 | }
40 |
41 | // InitComponents 初始化组件
42 | func InitComponents(app *widgets.QMainWindow) {
43 | // 布局窗口组件载体
44 | widget := widgets.NewQWidget(app, core.Qt__Widget)
45 | widget.SetGeometry2(0, 0, 300, 220)
46 | app.SetCentralWidget(widget)
47 |
48 | btn1 := widgets.NewQPushButton2("Button1", widget)
49 | btn1.SetObjectName("Button1")
50 | btn1.Move2(30, 50)
51 |
52 | btn2 := widgets.NewQPushButton2("Button2", widget)
53 | btn2.SetObjectName("Button2")
54 | btn2.Move2(150, 50)
55 |
56 | btn1.ConnectClicked(buttonClicked(app, btn1))
57 | btn2.ConnectClicked(buttonClicked(app, btn2))
58 | }
59 |
60 | func buttonClicked(app *widgets.QMainWindow, btn *widgets.QPushButton) func(checked bool) {
61 | return func(checked bool) {
62 | fmt.Printf("======== %#v\n", btn.ObjectName())
63 | fmt.Printf("======== %#v\n", app.Sender().ObjectName())
64 | if btn.Text() == "Button2" {
65 | app.StatusBar().ShowMessage(btn.Text(), -1)
66 | }
67 | }
68 | }
69 |
70 | func main() {
71 | // 创建一个应用程序对象
72 | // sys.argv参数是一个列表,从命令行输入参数
73 | widgets.NewQApplication(len(os.Args), os.Args)
74 |
75 | // 初始化主窗口
76 | app := InitMainWindow()
77 |
78 | // 初始化组件
79 | InitComponents(app)
80 |
81 | // 控制窗口显示在屏幕中心的方法
82 | center(app)
83 |
84 | // 显示主窗口
85 | app.Show()
86 |
87 | // 确保应用程序干净的退出
88 | widgets.QApplication_Exec()
89 | }
90 |
--------------------------------------------------------------------------------