共享库事件循环问题中的QApplication

时间:2016-02-02 11:43:40

标签: qt webkit qwebpage qeventloop qapplication

我尝试在共享库中使用QWebPage,这意味着我必须拥有QApplication来获取运行的GUI上下文。我已经构建我的代码以实现这一点,但是只要我运行qApp->exec()事件循环完全阻塞并阻止执行任何其他操作。这是在OS X上运行的共享库,我还没有尝试过任何其他平台。

我尝试添加QTimer来触发每100毫秒,但是没有被调用,我假设事件循环阻塞。我已在下面添加了我的QApplication设置代码。我假设我需要在一个帖子中运行它,或者我错过了一些微不足道的事情,但我完全不确定是什么。

web_lib.cpp

WebLib::WebLib(int argc, char *argv[])
{
    QApplication a(argc, argv, false);
    connect(&m_eventTimer, SIGNAL(timeout()), this, SLOT(handleEvents()));
    m_eventTimer.start(100);

    a.exec();
}
void WebLib::renderFile(QString file
{
    ...some connection code that's boring here
    m_page = new QWebPage;
    m_page->mainFrame()->load(file);
}
void WebLib::handleEvents() 
{
    qApp->processEvents()
}

web_lib.h

class WEBLIBSHARED_EXPORT WebLib: public QObject
{
    Q_OBJECT
public:
    WebLib();
    WebLib(int argc, char *argv[]);
    void renderFile(QString fileName);

private slots:
    void handleEvents();

private:
    QWebPage *m_page;

    QTimer m_eventTimer;
};

的main.cpp

int main(int argc, char *argv[])
{
    WebLib *webLib = new webLib(argc, argv);
    svgLib->renderFileFromName("somePath");

    return 0;
}

3 个答案:

答案 0 :(得分:1)

您的事件循环无关。您需要在调用a.exec()之前发出渲染文件请求,而不是之后。换句话说,您需要进行以下更改:

在WebLib构造函数中: 1.删​​除对a.exec()的调用。 2.动态分配QApplication而不是将其放在堆栈上。 3.取下定时器,你不需要它。

在web_lib.cpp中: 添加WebLib :: run(),它将调用a.exec()。

在main.cpp中: 调用renderFile()之后,调用webLib-> run()。

答案 1 :(得分:1)

  

一旦我运行qApp->exec(),事件循环就会完全阻塞并阻止执行任何其他操作。

那是对的。在完成渲染后,您应该退出事件循环。

计时器没用,因为从processEvents这样的非阻塞插槽调用handleEvents只会迫使事件循环在短时间内重新进入,无缘无故。

答案 2 :(得分:-1)

必须在胎面上运行QApplication::processEvents。或者,您可以定期致电{{1}}。