Qt子线程创建excel文件报错QObject: Cannot create children for a parent that is in a different thread.

  • 由于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开始的  
            }  
        }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值