C++ 项目转换为 Qt 项目,并实现点击按钮调用原 foot_test.cpp
中 main
方法的详细步骤:
1. 创建 Qt 项目
- 打开 Qt Creator,选择 “新建项目”,在项目模板中选择 “Qt Widgets Application”(如果是基于图形界面且有按钮等控件需求的话,这个模板比较合适),然后按照向导提示进行操作。
- 输入项目名称(比如
FootTestQt
),选择项目保存的路径,点击 “下一步”,选择合适的构建套件(Kit,一般根据你已安装的 Qt 版本和编译器等进行选择),继续点击 “下一步”,直到完成项目的创建。
2. 配置 Qt 项目以包含原 C++ 项目相关内容
2.1 复制原 C++ 项目文件到 Qt 项目目录(可选但推荐)
为了方便管理和确保项目能正确找到所有相关文件,可以将原 C++ 项目中的关键文件和文件夹复制到新创建的 Qt 项目目录下。例如,把 include
文件夹、lib
文件夹以及 fpms_algorithms_fppdev_balance_realtime.bmp
等相关资源文件复制过来(确保复制操作符合原项目的版权等相关规定哦)。
2.2 修改 Qt 项目的 .pro
文件
在 Qt 项目的 .pro
文件(比如 FootTestQt.pro
)中添加对原 C++ 项目相关库的链接以及头文件包含路径的配置,示例如下:
# 基础模块添加(一般已有部分,保持不变)
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets# 添加原项目相关库的链接配置(以下以Debug版本为例,Release版本类似处理,后面详细说)
# 假设SMiTSenseAlgorithms库在Debug版本下的库文件名为lib_fpms_algorithms-c3-3.0d.lib
LIBS += -L$$PWD/lib/SMiTSenseAlgorithms/Debug -llib_fpms_algorithms-c3-3.0d
# 对于SMiTSenseUsb库(Debug版本)
LIBS += -L$$PWD/lib/SMiTSenseUsb/Debug -lSMiTSenseUsb-F3.0d
# OpenCV库(Debug版本,根据实际库文件名调整)
LIBS += -L$$PWD/lib -lopencv_world3414d# 添加头文件包含路径,指向原项目的include文件夹(根据实际路径调整)
INCLUDEPATH += include/SMiTSenseUsbINCLUDEPATH += include/SMiTSenseAlgorithmsINCLUDEPATH += include/opencv
INCLUDEPATH += include/opencv2
#
上述配置中:
LIBS
变量指定了要链接的库文件,-L
后面是库文件所在的路径(通过$$PWD
表示项目当前路径,可根据实际情况调整),-l
后面跟着的是去掉.lib
后缀的库文件名,确保路径和文件名与实际的库文件情况相符,并且要注意不同编译版本(Debug 和 Release)对应的库文件名不同,需要正确配置。INCLUDEPATH
变量设置了头文件的搜索路径,这样编译器就能找到原项目中的那些头文件进行编译了。
对于处理不同编译版本(Debug 和 Release)的情况,可以使用条件判断来配置不同版本对应的库链接,如下所示:
CONFIG(debug, debug|release) {# Debug版本库文件链接配置(示例,按实际情况修改)LIBS += -L$$PWD/lib/SMiTSenseAlgorithms/Debug -llib_fpms_algorithms-c3-3.0dLIBS += -L$$PWD/lib/SMiTSenseUsb/Debug -lSMiTSenseUsb-F3.0dLIBS += -L$$PWD/lib -lopencv_world3414d
} else {# Release版本库文件链接配置(示例,按实际情况修改)LIBS += -L$$PWD/lib/SMiTSenseAlgorithms/Release -llib_fpms_algorithms-c3-3.0LIBS += -L$$PWD/lib/SMiTSenseUsb/Release -lSMiTSenseUsb-F3.0LIBS += -L$$PWD/lib -lopencv_world3414
}
这样在 Qt 中选择 Debug 编译模式时,会链接 Debug 版本的库;选择 Release 编译模式时,会链接 Release 版本的库,保障项目能在不同编译模式下正确编译和运行。
3. 创建 Qt 界面并添加按钮
- 在 Qt Creator 中,打开项目的
mainwindow.ui
文件(如果是基于Qt Widgets Application
模板创建的项目,会自动生成这个文件用于设计界面),通过拖拽的方式从左侧的 “部件箱” 中把QPushButton
(按钮控件)添加到界面上。 - 选中添加的按钮,在右侧的 “属性编辑器” 中,可以设置按钮的
text
属性来改变按钮上显示的文字(比如设置为 “调用原 main 方法”),同时设置objectName
属性为一个有意义的名称(例如callMainButton
,后续在代码中会通过这个名称来关联按钮的操作)。
4. 在 Qt 代码中实现按钮点击调用原 main
方法的功能
4.1 在 mainwindow.h
文件中声明槽函数
打开 mainwindow.h
文件,添加对按钮点击对应的槽函数的声明,示例如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>// 其他可能需要引入的头文件(比如如果原main方法里用到了某些特定类型,要引入相关头文件)QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_callMainButton_clicked(); // 声明按钮点击对应的槽函数,名称要和按钮的objectName对应private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
4.2 在 mainwindow.cpp
文件中实现槽函数并调用原 main
方法
打开 mainwindow.cpp
文件,实现上述声明的槽函数,并且在合适的地方调用原 foot_test.cpp
中的 main
方法,示例代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
// 引入原foot_test.cpp文件,这样才能调用其中的main方法(假设原文件和当前Qt项目文件在同一级目录下,如果不是需要调整路径)
#include "foot_test.cpp"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 连接按钮点击信号和槽函数(确保按钮的objectName设置正确,这里是callMainButton)connect(ui->callMainButton, &QPushButton::clicked, this, &MainWindow::on_callMainButton_clicked);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_callMainButton_clicked()
{// 调用原foot_test.cpp中的main方法,这里可能需要根据原main方法的具体实现情况做一些调整// 比如原main方法可能有参数等情况,要按照实际要求传入合适的参数,如果原main方法没有参数,直接调用即可main();
}
在上述代码中:
- 在
MainWindow
类的构造函数里,通过connect
函数将界面上按钮(callMainButton
)的点击信号(clicked
信号)与我们自定义的槽函数on_callMainButton_clicked
进行连接,这样当按钮被点击时,就会执行槽函数里的代码。 - 在
on_callMainButton_clicked
槽函数中,直接调用了main
方法(假设原foot_test.cpp
中的main
方法没有参数等特殊情况,如果有参数等要求,需要根据实际情况进行相应的参数传递等处理),从而实现了点击 Qt 界面按钮调用原main
方法的功能。
5. 可能遇到的问题及解决办法
5.1 库文件找不到问题
如果编译时出现类似 “无法找到 xxx.lib” 这样的报错,可能原因及解决办法如下:
- 路径配置错误:仔细检查
.pro
文件中LIBS
变量里设置的库文件路径(-L
后面的路径)是否准确,确保路径指向了实际存在库文件的文件夹。例如,如果实际库文件在C:/MyProject/libs
这个路径下,而你在.pro
文件中配置的是$$PWD/lib
(假设$$PWD
对应的路径不是C:/MyProject/libs
),那就会找不到库文件,需要修改路径配置为正确的路径。 - 库文件名错误或缺失:检查
-l
后面跟着的库文件名是否正确,要与实际的库文件名称(去掉.lib
后缀)一致,并且要确保对应的库文件确实存在于配置的路径下。另外,注意不同编译版本(Debug 和 Release)对应的库文件名不同,要根据实际编译模式正确配置相应的库文件名。
5.2 头文件找不到问题
若出现 “头文件 xxx.h 未找到” 这样的报错,通常是 INCLUDEPATH
配置有问题:
- 检查路径准确性:确认
.pro
文件中INCLUDEPATH
变量设置的头文件包含路径是否正确,确保路径能准确指向包含对应头文件的文件夹。例如,如果原项目头文件实际在C:/MyProject/include/opencv2
这个路径下,而你配置的INCLUDEPATH
没有包含这个准确路径,就需要添加或者修改路径配置使其正确。 - 头文件引入顺序或冲突问题:有时候即使路径配置正确,但由于头文件引入顺序不合理或者存在头文件中类型重定义等冲突情况,也可能导致编译器认为头文件找不到。可以尝试调整头文件引入顺序,将相关的系统头文件(如 OpenCV 头文件)尽量放在自定义头文件之前引入,避免出现一些潜在的冲突。如果存在重定义问题,可能需要对相关的头文件进行修改(比如添加合适的宏定义来避免重复包含等处理)。
5.3 运行时链接错误问题
在编译通过但运行程序时出现找不到相关库或者函数调用错误等链接相关问题,可能是以下原因:
- 缺少依赖库的动态链接库文件(.dll 文件):确保在运行程序时,对应的动态链接库文件(如
opencv_world3414.dll
等)所在的路径能被系统找到。一种常见的做法是将这些.dll
文件复制到生成的可执行文件所在的文件夹下(即 Qt 项目编译后生成.exe
文件的那个文件夹,一般在项目的构建目录下,比如x64/Debug
或者x64/Release
等文件夹,取决于编译模式),或者将这些.dll
文件所在的路径添加到系统的环境变量PATH
中(不过这种方式不太推荐,可能影响系统其他程序的运行环境,建议优先采用复制到可执行文件同文件夹的方式)。 - 不同编译版本的库混用问题:比如在编译时链接的是 Debug 版本的库,但运行时系统找到了 Release 版本的动态链接库文件,或者反之,就可能导致运行时链接错误。要确保编译和运行时使用的库版本是一致的,按照前面步骤中对 Debug 和 Release 版本库的正确配置来操作,并且保证对应的
.dll
文件也是相应版本的。
引入文件的时候 头文件引入一下,可以批量引入
cpp也引入一下
右键添加新文件就行,c++项目有什么 你的qt项目就加什么
最终实现样式
下面是qt
最后如果编译报错,看看引入方式
-
-
尖括号
<>
引用方式- 含义:
- 当使用尖括号
<>
来包含头文件时,如<iostream>
和<opencv2/opencv.hpp>
,编译器会在系统的标准头文件路径以及通过编译器选项(如-I
选项指定的路径)和项目设置(如 Qt 项目的INCLUDEPATH
)所指定的路径中查找头文件。这种方式通常用于包含标准库头文件或者项目中公共的、被广泛使用的头文件。
- 当使用尖括号
- 用途示例:
- 对于标准库头文件,像
<iostream>
用于输入输出流操作,<vector>
用于处理动态数组等,它们是 C++ 标准库的一部分,编译器知道在标准库的安装路径中查找这些头文件。在多个源文件中,如果都需要使用标准库的功能,使用尖括号包含头文件是一种规范的做法。 - 对于项目中自定义的公共头文件,假设你的项目中有一个公共的工具头文件
common_utils.hpp
,并且这个头文件的位置通过项目设置添加到了头文件查找路径中,那么在需要使用这个工具头文件的源文件中,可以使用<common_utils.hpp>
来包含它,这样可以明确表示这是一个公共的、类似标准库头文件风格的引用。
- 对于标准库头文件,像
- 优势:
- 清晰地表明头文件是属于标准库或者项目公共部分,编译器会按照标准的查找路径和顺序去寻找,有助于保持代码的规范性和可维护性。而且在一些集成开发环境(IDE)和构建系统中,对于使用尖括号包含的头文件,会有更好的代码提示和自动补全功能,因为它们通常是被广泛认可的标准库或者项目核心头文件。
- 含义:
-
双引号
""
引用方式- 含义:
- 当使用双引号
""
来包含头文件时,如"lib_fpms_usb.h"
和"lib_fpms_algorithms.h"
,编译器首先会在包含该#include
指令的文件所在的目录中查找头文件。如果在当前目录中没有找到,才会按照尖括号<>
的查找路径去寻找。这种方式通常用于包含项目中自定义的、与当前源文件关系密切的头文件,特别是那些属于模块内部或者特定功能实现相关的头文件。
- 当使用双引号
- 用途示例:
- 假设你正在开发一个软件模块,这个模块有自己的头文件和源文件,头文件用于声明模块内部的类、函数等接口,源文件用于实现这些接口。在源文件中,你会使用双引号来包含这些自定义的头文件,因为它们是模块特有的,与当前源文件紧密相关。例如,
"lib_fpms_usb.h"
可能是一个用于与特定 USB 设备通信的库的头文件,这个库是你自己开发或者是项目特有的,使用双引号包含可以方便地找到它,并且表明它是属于项目自定义的部分。
- 假设你正在开发一个软件模块,这个模块有自己的头文件和源文件,头文件用于声明模块内部的类、函数等接口,源文件用于实现这些接口。在源文件中,你会使用双引号来包含这些自定义的头文件,因为它们是模块特有的,与当前源文件紧密相关。例如,
- 含义:
-