简介
在UI A 中嵌套UI_B, UI_B 是前面搭建的一个UI控件
创建 UI 文件
创建UI TextWidget
ObjectName : TextWidget
文件名保存为: textwidget.ui
拖了一个QTextWidget到创建的界面中
创建UI MainWindow, 并使用 TextWidget
使用 Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建 中创建的的login.ui
在界面中拖动一个QWidget, 并修改ObjectName为TextWidget
提升TextWidget
编译UI文件 到 Go
1. 将login.ui 和 textwidget.ui放到ui目录中
2. 利用 Goland外部工具 或指令将UI转成go文件
参考 Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建 进行外部工具配置
或指令: E:\CodePath\Golang\bin\goqtuic.exe -go-ui-dir=../uitogo -ui-file=ui
微创手术代码整改
textwidget_ui.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // WARNING! All changes made in this file will be lost! package ui import ( "github.com/therecipe/qt/core" "github.com/therecipe/qt/widgets" ) /* 增加代码 TextWidget */ type TextWidget struct { *UITextWidget *widgets.QWidget } /* 增加代码 NewTextWidget */ func NewTextWidget(parent widgets.QWidget_ITF, ff core.Qt__WindowType) *TextWidget { var textWidget = &TextWidget{ UITextWidget: &UITextWidget{}, QWidget: widgets.NewQWidget(parent, ff), } textWidget.UITextWidget.SetupUI(textWidget.QWidget) return textWidget } type UITextWidget struct { HorizontalLayout *widgets.QHBoxLayout TextEdit *widgets.QTextEdit } func (this *UITextWidget) SetupUI(TextWidget *widgets.QWidget) { TextWidget.SetObjectName("TextWidget") TextWidget.SetGeometry(core.NewQRect4(0, 0, 400, 185)) this.HorizontalLayout = widgets.NewQHBoxLayout2(TextWidget) this.HorizontalLayout.SetObjectName("horizontalLayout") this.HorizontalLayout.SetContentsMargins(0, 0, 0, 0) this.HorizontalLayout.SetSpacing(0) this.TextEdit = widgets.NewQTextEdit(TextWidget) this.TextEdit.SetObjectName("TextEdit") this.HorizontalLayout.AddWidget(this.TextEdit, 0, 0) this.RetranslateUi(TextWidget) } func (this *UITextWidget) RetranslateUi(TextWidget *widgets.QWidget) { _translate := core.QCoreApplication_Translate TextWidget.SetWindowTitle(_translate("TextWidget", "Form", "", -1)) } |
login_ui.go // 依葫芦(textwidget_ui.go)画瓢
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | // WARNING! All changes made in this file will be lost! package ui import ( "github.com/therecipe/qt/core" "github.com/therecipe/qt/widgets" ) /* 增加代码 LoginMainWindow */ type LoginMainWindow struct { *UILoginMainWindow *widgets.QMainWindow } /* 增加代码 NewLoginMainWindow */ func NewLoginMainWindow(parent widgets.QWidget_ITF, ff core.Qt__WindowType) *LoginMainWindow { var mainwindow = &LoginMainWindow{ UILoginMainWindow: &UILoginMainWindow{}, QMainWindow: widgets.NewQMainWindow(nil, core.Qt__Window), } mainwindow.UILoginMainWindow.SetupUI(mainwindow.QMainWindow) return mainwindow } type UILoginMainWindow struct { Centralwidget *widgets.QWidget VerticalLayout *widgets.QVBoxLayout Widget *widgets.QWidget GridLayout2 *widgets.QGridLayout LineEdit *widgets.QLineEdit Label3 *widgets.QLabel Label2 *widgets.QLabel LineEdit2 *widgets.QLineEdit Widget3 *widgets.QWidget HorizontalLayout *widgets.QHBoxLayout HorizontalSpacer *widgets.QSpacerItem PushButton *widgets.QPushButton HorizontalSpacer2 *widgets.QSpacerItem TextWidget *TextWidget // 修改代码 去掉 widgets. Menubar *widgets.QMenuBar Statusbar *widgets.QStatusBar } func (this *UILoginMainWindow) SetupUI(MainWindow *widgets.QMainWindow) { MainWindow.SetObjectName("MainWindow") MainWindow.SetGeometry(core.NewQRect4(0, 0, 249, 269)) this.Centralwidget = widgets.NewQWidget(MainWindow, core.Qt__Widget) this.Centralwidget.SetObjectName("Centralwidget") this.VerticalLayout = widgets.NewQVBoxLayout2(this.Centralwidget) this.VerticalLayout.SetObjectName("verticalLayout") this.VerticalLayout.SetContentsMargins(4, 0, 4, 0) this.VerticalLayout.SetSpacing(0) this.Widget = widgets.NewQWidget(this.Centralwidget, core.Qt__Widget) this.Widget.SetObjectName("Widget") this.GridLayout2 = widgets.NewQGridLayout(this.Widget) this.GridLayout2.SetObjectName("gridLayout_2") this.GridLayout2.SetContentsMargins(0, 0, 0, 0) this.GridLayout2.SetSpacing(4) this.LineEdit = widgets.NewQLineEdit(this.Widget) this.LineEdit.SetObjectName("LineEdit") this.GridLayout2.AddWidget3(this.LineEdit, 0, 1, 1, 1, 0) this.Label3 = widgets.NewQLabel(this.Widget, core.Qt__Widget) this.Label3.SetObjectName("Label3") this.GridLayout2.AddWidget3(this.Label3, 1, 0, 1, 1, 0) this.Label2 = widgets.NewQLabel(this.Widget, core.Qt__Widget) this.Label2.SetObjectName("Label2") this.GridLayout2.AddWidget3(this.Label2, 0, 0, 1, 1, 0) this.LineEdit2 = widgets.NewQLineEdit(this.Widget) this.LineEdit2.SetObjectName("LineEdit2") this.LineEdit2.SetEchoMode(widgets.QLineEdit__Password) this.GridLayout2.AddWidget3(this.LineEdit2, 1, 1, 1, 1, 0) this.Widget3 = widgets.NewQWidget(this.Widget, core.Qt__Widget) this.Widget3.SetObjectName("Widget3") this.HorizontalLayout = widgets.NewQHBoxLayout2(this.Widget3) this.HorizontalLayout.SetObjectName("horizontalLayout") this.HorizontalLayout.SetContentsMargins(0, 0, 0, 0) this.HorizontalLayout.SetSpacing(0) this.HorizontalSpacer = widgets.NewQSpacerItem(40, 20, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Minimum) this.HorizontalLayout.AddItem(this.HorizontalSpacer) this.PushButton = widgets.NewQPushButton(this.Widget3) this.PushButton.SetObjectName("PushButton") this.HorizontalLayout.AddWidget(this.PushButton, 0, 0) this.HorizontalSpacer2 = widgets.NewQSpacerItem(40, 20, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Minimum) this.HorizontalLayout.AddItem(this.HorizontalSpacer2) this.GridLayout2.AddWidget3(this.Widget3, 2, 0, 1, 2, 0) this.VerticalLayout.AddWidget(this.Widget, 0, 0) this.TextWidget = NewTextWidget(this.Centralwidget, core.Qt__Widget) // 修改代码 去掉 widgets. 增加第二参数core.Qt__Widget this.TextWidget.SetObjectName("TextWidget") this.VerticalLayout.AddWidget(this.TextWidget, 0, 0) MainWindow.SetCentralWidget(this.Centralwidget) this.Menubar = widgets.NewQMenuBar(MainWindow) this.Menubar.SetObjectName("Menubar") this.Menubar.SetGeometry(core.NewQRect4(0, 0, 249, 23)) MainWindow.SetMenuBar(this.Menubar) this.Statusbar = widgets.NewQStatusBar(MainWindow) this.Statusbar.SetObjectName("Statusbar") MainWindow.SetStatusBar(this.Statusbar) this.RetranslateUi(MainWindow) } func (this *UILoginMainWindow) RetranslateUi(MainWindow *widgets.QMainWindow) { _translate := core.QCoreApplication_Translate MainWindow.SetWindowTitle(_translate("MainWindow", "MainWindow", "", -1)) this.Label3.SetText(_translate("MainWindow", "密码", "", -1)) this.Label2.SetText(_translate("MainWindow", "用户名", "", -1)) this.PushButton.SetText(_translate("MainWindow", "登录", "", -1)) } |
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package main import ( "github.com/therecipe/qt/widgets" "os" myui "go_with_qt/ui" ) func main() { widget := widgets.NewQApplication(len(os.Args), os.Args) myui.NewLoginMainWindow().Show() widget.Exec() } |
编译 main.go,
指令 - qtdeploy.exe -qt_dir=E:\CodePath\Golang\bin\env_windows_amd64_513 -qt_version="5.13.0" build desktop main.go
问题:
1.
原因是创建的NewTextWidget 方法 与编译后生成的uic_xx.go 内部的NewTextWidget重名了,qtdeploy 编译时会生成ui目录, 并产生对应的uic_xxx.go
解决方法(两种方法):
(1) 修改UI编译成go的生成路径, 修改为../uitogo, 已经编译好的, 直接创建新目录放置进去,错开
E:\CodePath\Golang\bin\goqtuic.exe -go-ui-dir=../uitogo -ui-file=ui
(2) 将NewLoginMainwindow 和 NewTextWidget改成 _NewMainWindows 和 _NewTextWidget
2. 要是出现 问题, 先在工程目录,即mod文件所在目录执行下面
go mod tidy 或 go mod download
go mod vendor
再重新进行编译
资源
本例代码 - https://download.csdn.net/download/halo_hsuh/12533596
- 和彩云 http://caiyun.feixin.10086.cn/dl/0r5Csgtw7l5xo 提取密码:AdJF