- 由于
QAxObject
是非线程安全的,因此这个操作应该在主线程中执行,或者你需要确保对COM对象的调用是线程安全的。在Qt中,通常建议将涉及GUI或特定于平台的操作(如COM调用)放在主线程中处理。 - 本工程中,笔者在子线程的run函数中新建了用于创建excel文件的QObject对象,语句如下:
QAxObject *excel = new QAxObject(this); excel->setControl("Excel.Application");//连接Excel控件 excel->dynamicCall("SetVisible (bool Visible)", "false");//不显示窗体 excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合 workbooks->dynamicCall("Add");//新建一个工作簿 QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿 QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);//获取工作表集合的工作表1,即sheet1
程序不停报错,错误提示如标题所示,或者直接崩溃,其实就是因为QObject变量不适宜出现在子线程及其函数中,应该出现在widget.cpp的界面显示程序里,如果要新建一个子线程实现新建excel表格的功能,应该下载并使用QXlsx库。写完会继续更。
-
---------------------------------------------更新
-
1. 下载并安装QXlsx库
-
这一步教程笔者参考链接:【QXlsx】 - Qt 处理Execl文件开源库的使用(一)1. 简介 QXlsx 是一个用于在 Qt 框架中处理 E - 掘金 (juejin.cn)
-
总结下来就是先在链接中下载https://github.com/QtExcel 工程,是一个压缩包
-
解压,
-
将这个文件夹复制粘贴到Qt工程中
-
需要用到的是.pri文件
-
在工程的pro文件中添加如下语句:
-
include($$PWD/QXlsx/QXlsx.pri) INCLUDEPATH+=$$PWD/QXlsx
-
运行,不报错,并且工程文件中出现QXlsx文件夹,说明添加库成功
-
2.调用这个库
-
#include<xlsxdocument.h>
-
3.然后就可以在子线程中使用QXlsx库新建excel文件并写入内容了,下面是一个简单的示例,把这个操作写在了子线程的run函数里面。
-
void ExcelGeneratorThread::run() { QXlsx::Document xlsx; //如果文件不存在,它将创建一个新的文件;如果文件已存在,它将打开该文件。 xlsx.write("A1", "Hello, Qt!"); xlsx.write("A2", "This is a test Excel file created by a QThread."); xlsx.saveAs(m_fileName); emit fileCreated(m_fileName); }
如果要批量写入数据,可以先把数据放入Vector中,通过双层for循环,批量将数据写入单元格中,示例:
-
QVector<QVector<QVariant>> data = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 写入数据 for (int row = 0; row < data.size(); ++row) { for (int col = 0; col < data[row].size(); ++col) { xlsx.write(row + 1, col + 1, data[row][col]); // 注意:Excel的行和列是从1开始的 } }
Qt子线程创建excel文件报错QObject: Cannot create children for a parent that is in a different thread.
于 2024-10-08 15:38:21 首次发布