• 9924阅读
  • 4回复

QAxObject + Excel + QThread的问题 [复制链接]

上一主题 下一主题
离线soulark
 

只看楼主 倒序阅读 楼主  发表于: 2009-03-05
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
小弟在写一个导入excel数据到mysql的程序. 
大致的UI是, 弹出一个dialog, 用户选择一个Excel文件, 点击"导入", dialog上播放"正在导入"的动画, 当导入成功之后, 提示用户导入成功,并关闭dialog.

如果我不用线程去做导入的工作, 在导入中的时候, dialog会"死"在那里. 也看不到"正在导入"的动画. 但是, 可以导入成功, 没其他问题.

之后, 我决定用一个线程去做导入的工作, 当完成之后, 会emit一个signal给主线程, 提示用户导入成功.  但是问题出现了:

我去创建QAxObject对象的时候, 会返回NULL, 而不用线程的时候, 能正常返回. 以下是部分代码:
void Thread::run()
{
    if (importExcel(filename))
        emit sigImportDone();
    else
        emit sigImportFail();
}

static bool importExcel(QString fileName)
{
    QAxObject *excel = new QAxObject("Excel.Application", NULL);
    Q_CHECK_PTR(excel);
    if (excel == NULL)
        return false;

    /*** Get workbook's set pointer. ***/
    QAxObject *workbooks = excel->querySubObject("Workbooks"); //问题就在这, 用QThread的子类去调用importExcel()的时候, 返回的workbooks是NULL. WHY????
    if (workbooks == NULL)
    {
        // 退出Excel进程.
        excel->dynamicCall("Quit()");
        delete excel;
        return false;
    }

    ...
}

望各位不吝赐教! 多谢!


离线cpem
只看该作者 1楼 发表于: 2009-09-24
你访问Excel的例子,发给我学习学习,好吗?
或者,指点一下,怎么访问Excel(不通过ODBC)?
离线cpem
只看该作者 2楼 发表于: 2009-09-24
求助了!先谢谢。
离线wxj120bw

只看该作者 3楼 发表于: 2010-08-25
离线XChinux

只看该作者 4楼 发表于: 2010-09-02
其实可以不必用线程,因为你读取 Excel的时候是一行一行,一个单元格一个单元格读取的吧?每读取一行或一个单元格,你调用下更新界面显示的方法以及 QApplication::processEvents()方法,这样界面上的东西就能动了,也能响应用户的输入了,只是这样的处理方式会降低读取Excel的速度。不过是一种解决方案,数据量没有那么的大的话,不可不接受的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个