Многопоточная обработка Excel с Qt? - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь обработать лист Excel, чтобы обработать данные в нем с помощью Qt (4.6.3). Я пытался использовать QAxWidget excel("Excel.Application") здесь здесь .

Сначала я попытался использовать его простым способом, все работает нормально, но графический интерфейс на некоторое время зависает, поэтому я попытался реализовать его в другом 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?

Спасибо.

Edit: Как сказал Райв, я заменил QAxWidget на QAxObject

Просто вызовите в run () потока:

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

и работает нормально.

1 Ответ

6 голосов
/ 14 июля 2011

Попробуйте QAxObject вместо QAxWidget, и он будет работать в другом потоке. Просто не забудьте вызвать CoInitialize () там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...