使用 Qt 进行多线程 Excel 处理?

问题描述 投票:0回答:2

我正在尝试处理 Excel 工作表,以使用 Qt (4.6.3) 对其中的数据进行一些处理。 我尝试使用

QAxWidget excel("Excel.Application")
,就像这里一样。

我首先尝试以简单的方法使用它,一切正常,但 GUI 冻结了一段时间,所以我尝试用不同的

QThread
来实现它。

正如某些人所说,不允许在主线程以外的其他线程中使用从

QWidget
继承的类。 我也尝试过这个方式,但无论如何都会出现运行时错误。

这是我的代码片段:

void MainDialog::extractData()
{
    QAxWidget excel("Excel.Application");
    excel.setProperty("Visible", false);

    QAxObject * workbooks = excel.querySubObject("WorkBooks");
    workbooks->dynamicCall("Open (const QString&)", ui->lineEditAdress->text());
    QAxObject * workbook = excel.querySubObject("ActiveWorkBook");
    QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);

    // ... some work here...

    workbook->dynamicCall("Close (Boolean)", false);
    excel.dynamicCall("Quit (void)");
}

我做错了什么?有更好的方法来完成工作吗?比 ActiveX 更好的主意?

谢谢。

编辑: 正如 Raiv 所说,我将

QAxWidget
替换为
QAxObject

只需调用线程的run()即可:

// ...
CoInitialize(0);
QAxObject excel("Excel.Application");
// ...

而且效果很好。

multithreading qt activex
2个回答
6
投票

尝试使用 QAxObject 而不是 QAxWidget,它可以在另一个线程中工作。只是不要忘记在那里调用 CoInitialize() 。


0
投票

我想补充更多:

void Fn:示例(){

 CoInitialize(0); // function used to initialize COM libraries in a process
 // code etc
 ...
 CoUninitialize(); // function used to release COM resources and end COM usage in a process

}

© www.soinside.com 2019 - 2024. All rights reserved.