使用Designer

上一节我们手撸了一个Hello World,然而对于稍微复杂一些的界面,手撸就实在太没有效率了。Designer才是GUI设计的神器。therecipe/qt集成了uic工具,可以方便地将Designer生成的ui文件转换成go文件(其实有的地方也不很方便,之后会提到)。

绘制界面

打开Designer,新建一个窗口,随便拖几个小部件上去,还是以Hello World为例,如下图:

为了简单考虑,objectName就不改了,都按照默认的来,窗口是Dialog,按钮是pushButton。在工程目录下新建一个ui文件夹,将窗口保存为window.ui。

在ui文件夹下新建一个window.go(叫什么名无所谓),就一句话,package ui。修改hello_world.go,改为:

package mainimport ("main/ui""os""github.com/therecipe/qt/widgets"
)func main() {widgets.NewQApplication(len(os.Args), os.Args)window := ui.NewDialog(nil)window.Show()widgets.QApplication_Exec()
}

执行qtdeploy build desktop hello_world.go,编译完成后,运行deploywindowshello_world.exe

复盘

我们已经完成了两个demo了,可以注意到,由于Go语言的特性,对于Qt的接口存在一些改动。比如所有的接口函数的首字母都大写了,这是因为在Go语言中,只有首字母大写的函数才会被外部访问到。某些函数的后边增加了数字,这是因为Go语言没有泛型,因此不同参数的函数必须通过函数名进行区分。这就体现出了VSCode的重要性了,当你不清楚一个函数后边的尾缀时,可以按Ctrl+空格进行代码补全,此时可以查看函数的名称和参数类型。

言归正传,让我们看看qtdeploy都做了什么。当执行完qtdeploy之后,在ui目录下会生成一个uic_window.go的文件,这个文件就是根据ui文件自动生成的go文件。

通常来讲,这个文件不应该手动修改,因为每次运行qtdeploy之后文件内容都会被还原。

可以看到,在这个文件中定义了一个名为NewDialog的函数,它的作用就是创立一个窗口,也就是对应hello_world.go的第12行。

我们在上一步的时候新建了window.go,其目的是定义了ui包,否则在hello_world.go里边找不到ui包,qtdeploy会直接报错,跑不到uic的这一步。

连接信号和槽

Qt是一个事件驱动的GUI库,当用户执行某些操作的时候会产生信号(signal),如果将信号和一个槽(slot)连接起来,那么当信号触发时,就会调用相应的槽函数。让我们尝试将按钮的clicked信号和窗口的close槽连接起来,实现按按钮退出窗口的功能。

在therecipe/qt中,连接信号和槽的方法与PyQt5有所不同(应该与C++的也不一样,C++不熟,没有考证),连接信号的函数为Connect+信号名的格式。需要注意的是,待连接的槽的参数如果和信号不一致是不能直接连接的。让我们修改window.go:

package uifunc (c *Dialog) init() {c.PushButton.ConnectClicked(func(s bool) { c.Close() })
}

再次执行qtdeploy,并运行生成的程序,可以发现,点按钮之后窗口可以退出了。

其实还有另一种更方便的连接信号的槽的方式,让我们先将window.go还原,之后直接在Designer里边进行连接,如图:

保存,并执行qtdeploy,生成的程序效果是一样的。

效率 qt_Qt开发之Go篇(三)相关推荐

  1. java jcombobox 样式_Swing开发之JComboBox篇

    JList和ComboBox很相似,因为这两个组件都显示一个项列表.因此,它们都有扩展ListModel接口的模型.而且,这两个组件都有绘制器,这些绘制器通过实现ListCellBenderer接口来 ...

  2. 跟着王进老师学开发之C#篇第五季:图书管理系统-王进-专题视频课程

    跟着王进老师学开发之C#篇第五季:图书管理系统-2659人已学习 课程介绍         本季视频通过完整的案例介绍了图书管理系统的开发,包含了数据库的设计.界面设计.代码实现等等,本系统的模块包含 ...

  3. Jmeter Kafka插件开发之Sampler篇

    Jmeter Kafka插件开发之Sampler篇 背景:在项目中经常需要往kafka里面写数据,并拿生成的数据执行后续的操作,并且有些接口中也需要用到kafka里的数据,小编使用JMeter做接口测 ...

  4. 微信开发 ━━ 微信商户v3微信支付H5方式开发之php篇

    native方式开发纪要:<微信开发 ━━ 微信商户native方式支付v3开发之php篇> 一.流程 流程是必须要弄懂的,弄懂之后遇到问题也能知道出在哪里. 官方说明:<H5支付统 ...

  5. 视频教程-跟着王进老师学开发之C#篇:基础语法-C#

    跟着王进老师学开发之C#篇:基础语法 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥208.00 ...

  6. 跟着王进老师学开发之C#篇:基础语法-王进-专题视频课程

    跟着王进老师学开发之C#篇:基础语法-10520人已学习 课程介绍         本次课程是初级课程,只要熟悉计算机的基本应用和操作,都可以完成本次课程学习.本课程深入浅出的介绍了C#语言的基本语法 ...

  7. 跟着王进老师学开发之Python篇第一季:基础入门篇-王进-专题视频课程

    跟着王进老师学开发之Python篇第一季:基础入门篇-2859人已学习 课程介绍         本季课程首先对Python简要介绍,然后演示如何搭建Python的开发环境,以及如何在IDE中调试Py ...

  8. 视频教程-跟着王进老师学开发之Python篇第一季:基础入门篇-Python

    跟着王进老师学开发之Python篇第一季:基础入门篇 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ...

  9. Delphi数据库开发之TTable篇1

    既然是说Delphi中的SQL使用,肯定离不开TDataSet派生出来的DataSet控件(应该说类比较确切些),这里我说的DataSet只是一个大类的称呼,并不是特指实际的TDataSet.在众多控 ...

最新文章

  1. dataTables基础函数变量
  2. Unity Mathf 数学运算(C#)
  3. 在eclipse中使用svn
  4. QML基础类型之bool
  5. Pensieve:AI带来的更流畅的高质量观看体验
  6. 前端之 JavaScript 基础
  7. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
  8. 不同网段通过静态路由实现互通,华为S5700交换机开启telnet远程指定IP登陆配置(强烈推荐)
  9. 1.软件架构设计:大型网站技术架构与业务架构融合之道 --- 五花八门的架构师职业
  10. 模块_time模块/copy模块/os模块
  11. Linux命令——创建删除文件
  12. matlab 图片显示函数,matlab图像显示函数
  13. 常用HTML登录页面模板
  14. H3CSE园区-STP
  15. 软件工程实践 Blog17
  16. 多维度分析评价体系:高校教学质量大数据应用解决方案
  17. oracle11g shrink,shrink lob
  18. 6岁就获吉尼斯世界纪录!这届10后程序员「小鬼当家」
  19. 【youcans 的 OpenCV 例程200篇】121. 击中-击不中用于特征识别
  20. 苹果开发者账户创建流程

热门文章

  1. shell编程中for/while/util/case/select/break/continue
  2. jquery单选框radio值改变change事件
  3. Silverlight C# 游戏开发:未写代码先设计
  4. Docker安装mysql容器
  5. Lua代码加密,防止代码反编译
  6. 洛谷——P1098 字符串的展开
  7. [PAL编程规范]SAP HANA PAL双变量几何回归预测分析Bi -Variate Geometric Regression编程规范FORECASTWITHGEOR(预测)...
  8. Spring学习(五)——Spring注解(一)
  9. 如何对软件项目团队成员进行角色和岗位的划分
  10. cmd文件内容添加到文件内容命令