QT5.15.2使用QXlsx读取Excel文件后退出程序时程序异常结束

QT5.15.2使用QXlsx读取Excel文件后退出程序时程序异常结束

这是一个困扰了我很久的问题,今天终于解决啦。

异常场景

我的情况是只要用了QXlsx去操作Excel文件后,在关闭程序时无法正常退出程序,会卡住,过一会后在QT的IDE上显示程序异常结束。

解决方法

主要原因在于QXlsx源码的xlsxcellreference.cpp中,
我们只需要找到void CellReference::init(const QString &cell_str)方法,把static thread_local QRegularExpression re(QStringLiteral("^\\$?([A-Z]{1,3})\\$?(\\d+)$"));thread_local修饰删掉,或者改成这样:

void CellReference::init(const QString &cell_str)
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    static QRegularExpression re(QStringLiteral("^\\$?([A-Z]{1,3})\\$?(\\d+)$"));
    QRegularExpressionMatch match = re.match(cell_str);
    if (match.hasMatch())
    {
        const QString col_str = match.captured(1);
        const QString row_str = match.captured(2);
        _row = row_str.toInt();
        _column = col_from_name(col_str);
    }
#else
    QRegExp re(QLatin1String("^\\$?([A-Z]{1,3})\\$?(\\d+)$"));
    if (re.indexIn(cell_str) != -1)
    {
        const QString col_str = re.cap(1);
        const QString row_str = re.cap(2);
        _row = row_str.toInt();
        _column = col_from_name(col_str);
    }
#endif
}

然后再找到QString col_to_name(int col_num)方法,同样的把static thread_local QMap<int, QString> col_cache;thread_local修饰删掉:

QString col_to_name(int col_num)
{
    static QMap<int, QString> col_cache;

    auto it = col_cache.find(col_num);
    if (it == col_cache.end()) {
        QString col_str;
        int remainder;
        while (col_num) {
            remainder = col_num % 26;
            if (remainder == 0)
                remainder = 26;
            col_str.prepend(QChar('A' + remainder - 1));
            col_num = (col_num - 1) / 26;
        }
        it = col_cache.insert(col_num, col_str);
    }

    return it.value();
}

保存后重新编译就行了,这样就能正常退出程序了

参考资料

其实QXlsx已经修复了这个问题,是因为我那个版本还存在这个问题而已,github的issues中就有了
https://github.com/QtExcel/QXlsx/issues/156
https://github.com/QtExcel/QXlsx/issues/153

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT是一个跨平台的GUI应用程序开发框架,可用于开发应用程序和用户界面。这里是一个简单的QT5.15.2使用教程: 1. 下载和安装QT5.15.2 首先,你需要从QT官网下载适合你的操作系统的QT5.15.2版本。下载完成后,按照安装程序指引完成安装。 2. 创建一个新的QT项目 打开QT Creator,点击“File”菜单,选择“New File or Project”,在弹出的对话框中选择“Application”,然后点击“Choose”。 在下一个对话框中,你需要选择一种模板来启动项目。选择“Qt Widgets Application”模板,并命名你的项目。然后,选择项目的存储位置,并点击“Next”。 在下一个对话框中,你需要选择QT版本和编译器。确保选择QT5.15.2版本和你的操作系统所支持的编译器。然后,点击“Next”。 最后,你需要选择要包含在项目中的类。你可以选择一个或多个类,也可以不选择任何类。然后,点击“Finish”按钮来完成项目创建过程。 3. 编写代码 在QT Creator中,你可以使用QT Designer来创建和编辑用户界面,然后使用C++来编写逻辑代码。你可以使用QT Creator中的代码编辑器来编写C++代码。在代码编辑器中,你可以使用自动完成功能、调试功能等工具来编写高质量的代码。 4. 编译和运行项目 在QT Creator中,你可以使用“Build”按钮来编译你的项目。如果编译成功,你可以使用“Run”按钮来运行你的项目。在运行过程中,你可以使用调试工具来调试你的代码。 以上是QT5.15.2使用教程的简单介绍。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1594231563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值