├── .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 | ![](./images/2023-08-05_17-57.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-06_12-40.png) 16 | ![](./images/2023-08-06_12-40_1.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-06_11-21.png) 11 | ![](./images/2023-08-06_11-21_1.png) 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 | ![](./images/2023-08-06_14-18.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-05_17-57.png) 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 | ![](./images/2023-08-06_17-54.png) 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 | ![](./images/2023-08-06_17-54.png) 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 | ![](./images/2023-08-05_17-54.png) 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 | ![](./images/2023-08-06_12-25.png) 11 | ![](./images/2023-08-06_12-25_1.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-06_12-23.png) 11 | ![](./images/2023-08-06_12-23_1.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-08.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_17-55.png) 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 | ![](./images/2023-08-05_17-57.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-06_13-36.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-05_18-10.png) 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 | ![](./images/2023-08-06_13-00.png) -------------------------------------------------------------------------------- /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 | ![](./images/2023-08-05_18-10.png) 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 | 45 | 46 | 47 | 0 48 | 0 49 | 532 50 | 23 51 | 52 | 53 | 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 | ![](./images/2023-08-05_17-57.png) 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 | --------------------------------------------------------------------------------