1. 概述

  • Qt做UI设计后,通常会生成Form Files文件夹下的ui文件、Generated File文件夹下的ui_xxx等头文件和源文件、Header Files文件夹下的头文件、Source Files文件夹下的源文件

2.

  • 打开一个新的Qt Dialog可以用exec方法,比如按钮点击触发或菜单按钮点击触发

    • 模态?关闭后回到代码继续进行
  • moc
    • Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。
    • moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。
    • 在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件。

3. 开发流程

  • 使用QT5->Launch Designer打开设计工具,设计界面,生成ui文件
  • 根据ui文件生成ui_xxx.h头文件
    • 手动
    • QCreator自动?
    • vs+Qt5自动
      • vs+Qt5+addin创建的工程自动?
      • 非vs+Qt5+addin创建的工程:
        • 在.ui文件上右击打开属性窗口,选择常规-项类型,选择自定义生成工具,Apply后会自动重新打开(或者保存后自己再打开),就出现了自定义生成工具选项
        • Command Line配置成"$(QTDIR)\bin\uic.exe" -o "$(ProjectDir)\GeneratedFiles\ui_%(Filename).h" "%(FullPath)",文件全路径名中除了%(Filename)参数都可以自己定
        • Outputs配置成$(ProjectDir)\GeneratedFiles\ui_%(Filename).h;%(Outputs),文件全路径名中除了%(Filename)参数都可以自己定
  • 根据ui_xxx.h头文件生成moc_xxx.cpp源文件
    • 手动

      • 切换到Qt的bin目录(如D:\Qt\Qt5.5.1\5.5\msvc2012\bin),然后uic TestQtDialog.ui -o TestQtDialog.h
    • QCreator自动?
    • vs+Qt5自动
      • vs+Qt5+addin创建的工程自动?
      • 非vs+Qt5+addin创建的工程:
        • 在ui_xxx.h文件上右击打开属性窗口,选择常规-项类型,选择自定义生成工具,Apply后会自动重新打开(或者保存后自己再打开),就出现了自定义生成工具选项
        • Command Line配置成"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp",文件全路径名中除了$(ConfigurationName)和%(Filename)参数都可以自己定
        • Outputs配置成.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp,文件全路径名中除了$(ConfigurationName)和%(Filename)参数都可以自己定
  • 工程包含ui_xxx.h和moc_xxx.cpp所在目录
    * Additional Dependencies设置成$(QTDIR)\bin\moc.exe;%(FullPath)

    • 通常还是会把ui文件、ui_xxx.h、moc_xxx.cpp文件include放到工程中,并且放在特定的物理文件夹和filter里

5. 其他

  • 链接时报错"No relevant classes found. No output generated."

    • 通常是因为该头文件不需要生成moc文件,也就是不需要moc'ing
    • 选中该头文件,Properties中把Item Type从Qt Moc Tool改成C/C++ Header就好了
    • 只有包含Q_OBJECT的.h头文件才需要被moc'ing
    • 参考
  • 链接时报错"unresolved external symbol "public: static struct QMetaObject const QWinWidget::staticMetaObject" (?staticMetaObject@QWinWidget@@2UQMetaObject@@B)"等

Qt学习(二):项目学习的更多相关文章

  1. Linq学习(二)-本次学习用到的资料

    本次学习用到的数据库初始化脚本如下 use KMS create table Blog_User ( UserId ,1), NickName ), CreateTime datetime ) cre ...

  2. Qt Lighthouse学习(二),就是QPA(Qt Platform Abstraction) 项目的名字

    上一次关注Qt Lighthouse是在6月初,可是现在都8月底了.时间真快... Lighthouse 是 QPA(Qt Platform Abstraction) 项目的名字,它使得将Qt移植到新 ...

  3. Qt Installer Framework的学习(二)

    Qt Installer Framework的学习(二) Qt Installer Framework的一些操作能够使用最常见的Qt项目来表示,也就是说,书写pro文件,使用qmake执行之,除了能够 ...

  4. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  5. day 82 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  6. Spring Boot 项目学习 (二) MySql + MyBatis 注解 + 分页控件 配置

    0 引言 本文主要在Spring Boot 基础项目的基础上,添加 Mysql .MyBatis(注解方式)与 分页控件 的配置,用于协助完成数据库操作. 1 创建数据表 这个过程就暂时省略了. 2 ...

  7. day 81 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  8. Qt Creator 源码学习笔记03,大型项目如何管理工程

    阅读本文大概需要 6 分钟 一个项目随着功能开发越来越多,项目必然越来越大,工程管理成本也越来越高,后期维护成本更高.如何更好的组织管理工程,是非常重要的 今天我们来学习下 Qt Creator 是如 ...

  9. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  10. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

随机推荐

  1. java获取取前段页面的参数

    request.getParameter("tnumber") document.forms[0].s_id.value;

  2. Spring Boot实践——Filter实现

    Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...

  3. Spring Boot实践——SpringMVC视图解析

    一.注解说明 在spring-boot+spring mvc 的项目中,有些时候我们需要自己配置一些项目的设置,就会涉及到这三个,那么,他们之间有什么关系呢? 首先,@EnableWebMvc=Web ...

  4. Squid 代理服务器日志管理

    简介: Squid 服务器日志增长是很快的,如果不做处理的话,可以会由于系统限制单文件大小,而导致 Squid 服务停止,太大的日志文件也不适合分析. 一.日志配置 shell > grep ' ...

  5. python中heapq堆的讲解

    堆的定义: 堆是一种特殊的数据结构,它的通常的表示是它的根结点的值最大或者是最小. python中heapq的使用 列出一些常见的用法: heap = []#建立一个常见的堆 heappush(hea ...

  6. 深度学习篇——Tensorflow配置(傻瓜安装模式)

    前言 如果你是一个完美主义者,那么请绕过此文,请参考<深度学习篇——Tensorflow配置(完美主义模式)> 安装 pip install tensorflow ok,只要不报错,安装就 ...

  7. 从0开始用spring boot编写分布式配置中心-peppa

    欢迎大家一起来编写peppa github地址: github 交流群: 目前市面上比较流行的分布式配置中心有disconf.apollo,用起来还是比较方便的,然而由于在权限管理这块做得不够好,导致 ...

  8. ShaderLab

    [ShaderLab] Shader is the root command of a shader file. Each file must define one (and only one) Sh ...

  9. JSP的原理、JSP的执行过程

    Jsp的本质是servlet, 通过response的printWriter返回,response的getOutputStream只能调用一次,返回流就不能返回页面刷新. JSP起源 在很多动态网页中 ...

  10. 每个内存大小:sudo dmidecode -t memory |grep -A16 "Memory Device$" |grep "Size:"

    CPU: 型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}' 数量:lscpu |grep "CPU ...