VS下使用QT踩过的一些坑

环境:QT5.13.0+VS2017(一定要15.9,详情见坑1)

坑1:在vs2017扩展与更新装好了QT以后QT VS tools有问题

描述详见:https://ask.youkuaiyun.com/questions/749987

原因:我之前因为一些原因从15.9的vs改成了15.0版本,之前15.9的时候装QT没问题,换成15.0重装就出错了。

解决:把vs版本升回15.9就ok了~

坑2:在VS空项目中使用QT宏定义Q_OBJECT出现无法解析的外部符号

描述:安好了QT插件在VS里可以创建QT的空项目,这时候用宏定义Q_OBJECT没问题,但是因为一些原因我要在创建的VS空项目里用,按下图依次配好环境后定义了以下代码的一个类,然后点击执行出现了无法解析的外部符号的错误。

//TrackerWindow.h
#include <QtWidgets/QMainWindow>


class FusionWindow : public QMainWindow
{
	Q_OBJECT
public:
	FusionWindow(QWidget *parent = Q_NULLPTR)
	{

	}
	
};
//main.cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>

#include "TrackerWindow.h"



int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	FusionWindow* w = new FusionWindow();
	w->show();

	return a.exec();
}

原因:是因为如果建QT的空项目编译器自己会在每个头文件(用了Q_OBJECT)中配置生成moc文件的一些环境,但是自己创的VS空项目没配置,因此出错。

解决:https://www.cnblogs.com/winstonet/p/10751064.html

<think>嗯...用户这次明确提出了关于Qt的ProcessError错误解决方案的需求。回顾之前的对话历史,用户似乎对技术问题的解决有系统化需求,而且特别强调引用的准确性——虽然这次引用的内容只是示例。用户的问题很聚焦:"QtProcessErrorsolution"。这属于Qt框架中QProcess模块的典型错误。考虑到用户直接搜索解决方案,应该更关注实用性和可操作性。ta可能正在开发中遇到问题,情绪上会比较急切。需要拆解ProcessError的可能原因:1)最常见的是进程启动失败(FailedToStart),可能是路径错误或权限问题2)其次是进程崩溃(Crashed)和读写错误(Read/WriteError)3)超时(Timedout)在长时间任务中也常见上次回答快速排序时我采用了代码示例+解决思路的模式,这次也应该保持:解释错误码含义+排查步骤+典型解决方案。特别要注意Qt跨平台特性,需要区分Windows/Linux/macOS下的不同表现。用户没有提供具体上下文,所以回答要覆盖通用场景。可以重点讲FailedToStart的排查,因为这是新手最容易。比如环境变量继承问题,在Windows下特别明显。还应该提醒用户查看errorString()的详细输出——很多开发者会忽略这个Qt提供的原生错误信息,其实它能直接定位问题根源。最后用示例代码展示完整的错误处理流程会更直观。既然用户要求参考站内引用,但暂时没有相关资料,我可以在回答末尾补充相关文档的官方链接作为延伸阅读。这样既专业又避免引用不存在的资源。</think> 以下是针对Qt中`QProcess::ProcessError`错误的全面解决方案,结合常见原因和调试步骤: --- ### 常见错误类型及解决方案 #### 1. **FailedToStart (0)**:进程启动失败 - **原因**: - 程序路径错误(如未设置工作目录) - 权限不足(Linux/macOS需`chmod +x`) - 依赖库缺失(Windows的DLL或Linux的.so文件) - **解决**: ```cpp QProcess process; process.setWorkingDirectory("/app/bin"); // 设置正确工作目录 process.setProgram("myapp"); process.setArguments({"-v"}); if(!process.startDetached()) { // 检查启动状态 qDebug() << "Error:" << process.errorString(); // 打印具体错误 } ``` #### 2. **Crashed (1)**:进程意外崩溃 - **原因**: - 被调用程序自身存在BUG - 跨平台兼容性问题(如Windows调用Linux二进制文件) - **解决**: - 使用`process.waitForFinished()`捕获崩溃信息: ```cpp QProcess process; process.start("buggy_app"); if(!process.waitForFinished(5000)) { // 超时检测 qCritical() << "Crash log:" << process.readAllStandardError(); } ``` #### 3. **Read/WriteError (4)**:读写失败 - **原因**: - 未正确关闭标准输入/输出通道 - 管道数据阻塞未及时读取 - **解决**: ```cpp process.closeWriteChannel(); // 写入后显式关闭通道 while(process.waitForReadyRead(1000)) { // 循环读取避免阻塞 qDebug() << process.readAllStandardOutput(); } ``` --- ### 通用调试步骤 1. **检查环境变量**: ```cpp qDebug() << "PATH:" << QProcess::systemEnvironment().filter("PATH"); ``` 若缺失路径,用`process.setEnvironment()`添加 2. **验证可执行文件**: ```cpp if(QFile::exists("/path/to/app")) qDebug() << "File is executable?:" << QFile::permissions("/path/to/app") & QFile::ExeUser; ``` 3. **捕获详细错误**: ```cpp connect(&process, &QProcess::errorOccurred, [](QProcess::ProcessError error){ qDebug() << "ProcessError code:" << error; }); ``` --- ### 跨平台注意事项 | 系统 | 关键点 | |-------------|-----------------------------| | **Windows** | 路径分隔符用`/`或`\\`,检查VC++运行库 | | **Linux/macOS** | 用`ldd`或`otool`检查依赖库,注意文件执行权限 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值