VS2008+Qt4: uic, moc使用小记&两类Link错误的解决方案

本文详细介绍如何在Visual Studio 2008环境下使用Qt4框架,包括利用Qt Designer设计UI界面,使用uic编译UI文件生成头文件,以及使用moc处理元对象编译问题。

关于在VS2008下使用Qt4,之前已有文章记录,该文章还给出了qmake的简单使用。

这里就不再重复了,有必要的话,请点击这个链接跳转到目标内容。

晕~~~外链图片看不了,点这里查看原文。

以下介绍uicmoc的使用。我们以一个对话框例子为依托,依照我自己的工作步骤来讲述。

1、首先,打开Qt Designer (Qt设计师),然后新建一个无按钮的对话框

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

然后在对话框上放置一个行编辑框(lineEdit)和两个按钮(OK,对象名okButton; Cancel,对象名cancelButton),如下图:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

然后保存到自己新建的工程文件夹。

2、打开VC2008,新建Win32空的console工程,添加现有项,也即刚才新建的*.ui窗体资源。当然也可以在VC2008的向导中新建窗体其实都一样,到这一步都是将其添加到工程。

然后对*.ui资源编译(uic即是UI Compiler,用户界面资源编译器)生成头文件。首先在该*.ui文件上右击,选择【属性】:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安

  

配置自定义生成步骤如下:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

命令行: uic  <[SrcPath]\UiName.ui>  -o  <[DstPath]\uiName.h>

然后执行【编译】:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

编译后生成ui_GoToCellDialog.h,如有必要,可打开该文件进行编辑,但若该*.ui被重新编译后,原来的h文件会被覆盖,也即是说,之前的改动也不存在了。

3、然后,我们来写一个新的对话框类,继承自QDialog类和刚才创建的GoToCellDialog类,不妨取名为gtc吧。新建头文件gtc.h编辑必要的代码,另外添加对OK/Cancel按钮的响应,也就是链接信号槽,注意这里用到了Q_OBJECT宏:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

然后新建gtc.cpp文件,编写该类的实现代码。

4、最后,新建主文件main.cpp,比较简单,就是:新建App,新建Dialog,更新并显示Dialog,执行App,主函数返回。/* 此部分略去约一万字 */

 

所有代码编写完毕后保存修改,全部编译,不出意外,会出现链接时错误(除非你以另外的方式,比如打开VS2008,按照新建Qt4工程向导方式来工作,又或者,你根本不是在VS2008下而是在QtCreator等环境中工作,那此文也没多大意义了)。

1)其一是在main.obj中类似于以下Link错误:

mian.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall QApplication::~QApplication(void)" (__imp_??1QApplication@@UAE@XZ),该符号在函数 _main 中被引用

问题原因:找不到该函数的定义(或者声明。一般是在lib中声明,在dll中定义)

解决办法:添加QtCore4.libQtGui4.lib输入(设置依赖项或者#pragma

2)其二是关于MetaObject中类似于以下Link错误:

gtc.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall gtc::metaObject(void)const " (?metaObject@gtc@@UBEPBUQMetaObject@@XZ)

问题原因:注意到Q_OBJECT宏,关于Meta Object请查阅相关资料,查阅之后就会明白这个问题。

解决办法:moc. 使用Meta Object Compiler(元对象编译器)对gtc.h编译,生成moc_gtc.cpp

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

命令行: moc  <[SrcPath]\SrcName.h>  -o  <[DstPath]\mocDst.cpp>

生成moc_gtc.cpp,将其加入到工程。

如此便解决以上两类Link问题。编译,链接,运行结果如下:

VS2008+Qt4: uic, moc使用小记两类Link错误的解决方案 - von.Ryan.Hack - 云山飘渺@海客长安
 

 ======================================================================

更多VC,Qt,OpenCV, C/C++,MFC,数据结构/算法,计算机网络等相关问题,欢迎讨论。

本文原创,作者 云山飘渺@海客长安

出处 http://fengyhack.blog.163.com/blog/static/2365830752014101753937958/

 


&lt;think&gt;嗯,用户问的是使用VS2022和Qt VS Tool进行系统开发的情况。我需要先确认用户的需求是什么。他们可能是一个开发者,想要开始一个项目,或者正在考虑工具的选择。首先,我应该介绍一下这两个工具的基本情况,以及为什么选择它们组合在一起。 首先,Visual Studio 2022是一个强大的IDE,适合C++开发,尤其是Windows平台。Qt则是一个跨平台的框架,结合Qt VS Tool可以让在VS中更方便地开发Qt应用。用户可能希望了解如何搭建环境,或者这个组合的优势在哪里。 接下来,我需要分步骤解释,比如环境搭建、创建项目、开发调试、跨平台处理等等。同时,用户可能关心开发过程中可能遇到的问题,比如配置问题、跨平台编译的注意事项,或者性能优化方面的建议。 另外,用户可能没有明确说出来的需求是,他们可能在考虑跨平台支持,或者希望利用Qt的丰富库来加快开发进度。需要强调Qt的UI设计能力和信号槽机制,以及如何与VS2022的调试工具结合使用。 可能还需要提到常见的错误或陷阱,比如版本兼容性,确保Qt版本和VS Tool的兼容,或者部署时的依赖问题。另外,可以推荐一些资源,如官方文档、社区支持,或者教程链接,帮助用户进一步学习。 最后,总结一下这种组合的优势,比如高效的开发环境、强大的调试工具、跨平台能力等,以及适合的应用场景,比如桌面应用、嵌入式系统等。这样用户能有一个全面的了解,并决定是否采用这种方案。&lt;/think&gt;使用 **Visual Studio 2022 + Qt VS Tools** 进行系统开发是一种高效且流行的组合,尤其适合开发跨平台的桌面应用、嵌入式界面或企业级系统。以下是详细的介绍和使用建议: --- ### **1. 工具组合的优势** - **Visual Studio 2022**:微软的旗舰级 IDE,提供强大的调试器、代码智能提示、性能分析工具和丰富的插件生态。 - **Qt Framework**:跨平台的 C++ 框架,提供 GUI、网络、数据库、多线程等模块,支持快速开发高质量的界面和系统。 - **Qt VS Tools**:官方插件,将 Qt 集成到 Visual Studio 中,直接管理 Qt 项目、资源文件和信号槽绑定。 --- ### **2. 环境搭建步骤** 1. **安装 Visual Studio 2022** - 下载时勾选 **C++ 桌面开发**(包含 MSVC 编译器)。 - 可选安装项:Git 工具、CMake 支持。 2. **安装 Qt 框架** - 前往 [Qt 官网](https://www.qt.io/) 下载 **Qt Online Installer**。 - 选择版本(推荐 **长期支持版**,如 Qt 5.15 LTS 或 Qt 6.x)。 - 安装时勾选与 VS 匹配的编译器(如 `MSVC 2019/2022`)和所需模块(如 `Qt Widgets`、`Qt Core`、`Qt Network`)。 3. **安装 Qt VS Tools 插件** - 在 VS2022 的 `Extensions -&gt; Manage Extensions` 中搜索 **Qt Visual Studio Tools** 并安装。 - 重启 VS,通过 `Qt -&gt; Qt Options` 添加已安装的 Qt 版本路径。 --- ### **3. 开发流程示例** #### **(1) 创建 Qt 项目** - 打开 VS2022,选择 `Create a new project -&gt; Qt Widgets Application`。 - 配置项目名称、路径和 Qt 版本。 - 自动生成 `main.cpp`、窗口类文件和 `.ui` 界面文件(基于 XML)。 #### **(2) 使用 Qt Designer 设计界面** - 双击 `.ui` 文件,通过拖拽控件(按钮、文本框等)设计界面。 - 保存后自动生成对应的 C++ 代码(通过 `uic` 工具),无需手动编写 UI 布局。 #### **(3) 编写业务逻辑** - 在窗口类中通过 `ui-&gt;xxx` 访问界面控件(如 `ui-&gt;pushButton`)。 - 使用 Qt 的 **信号槽机制** 绑定事件: ```cpp connect(ui-&gt;pushButton, &amp;QPushButton::clicked, this, &amp;MyWindow::onButtonClicked); ``` #### **(4) 调试与编译** - 利用 VS2022 的调试器设置断点、监视变量。 - 编译时自动调用 `moc`(元对象编译器)处理信号槽。 - 生成的可执行文件默认依赖 Qt 动态库,需部署时包含或静态链接。 --- ### **4. 跨平台与部署** - **跨平台编译**:在 Linux/macOS 上使用相同代码,通过 Qt Creator 或 CMake 重新编译。 - **减少依赖**: - 静态编译:在 Qt 安装时选择 `Static` 版本(需商业授权)。 - 动态链接:打包时包含 `Qt5Core.dll`、`Qt5Widgets.dll` 等文件。 - 使用工具 `windeployqt`(Windows)或 `macdeployqt`(macOS)自动收集依赖库。 --- ### **5. 常见问题与优化** - **Qt 版本兼容性**:确保 Qt VS Tools 插件与 Qt 版本匹配(如 Qt6 可能需要最新插件)。 - **中文乱码**:在代码中设置 UTF-8 编码: ```cpp #pragma execution_character_set(&quot;utf-8&quot;) ``` - **性能优化**: - 多线程使用 `QThread` 或 `QtConcurrent`。 - 避免频繁的 UI 线程阻塞,使用信号槽异步更新界面。 - **内存管理**:注意 Qt 的父子对象机制(自动释放内存)。 --- ### **6. 适用场景** - **企业管理系统**:利用 Qt 的数据库模块(如 `Qt SQL`)和图表控件(如 `Qt Charts`)。 - **工业控制界面**:基于 Qt Quick 开发高响应式 UI。 - **跨平台工具**:一次编写,多平台编译(Windows/Linux/macOS)。 --- ### **7. 学习资源推荐** - 官方文档:[Qt Documentation](https://doc.qt.io/) - 书籍:《C++ GUI Qt 编程》《Qt Creator 快速入门》 - 社区:Stack Overflow、知乎、Qt 中文论坛 --- 通过 **VS2022 + Qt VS Tools**,你可以高效完成从原型设计到部署的全流程,同时享受 Visual Studio 的调试能力和 Qt 的跨平台特性。如果需要更轻量级的开发体验,也可以尝试 **Qt Creator**,但 VS 更适合大型项目和企业环境。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值