1

我正在尝试QWebPage在共享库中使用,这意味着我必须在其中获得一个 GUI 上下文才能运行它。我已经构建了我的代码来实现它QApplication,但是一旦我运行qApp->exec()事件循环完全阻止并阻止其他任何事情的执行。这是在 OS X 上运行的共享库,我还没有尝试任何其他平台。

我尝试添加一个QTimerin 以每 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;
};

主文件

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

    return 0;
}
4

3 回答 3

1

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

在 WebLib 构造函数中: 1. 删除对 a.exec() 的调用。2.动态分配QApplication而不是入栈。3.去掉定时器,你不需要它。

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

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

于 2016-02-02T17:46:26.087 回答
1

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

这是正确的。完成渲染后,您应该退出事件循环。

计时器是无用的,因为processEvents从非阻塞插槽调用就像handleEvents简单地强制事件循环在短时间内重新进入,无缘无故。

于 2016-02-03T13:57:52.643 回答
-1

exec必须在胎面中运行。或者,您可以QApplication::processEvents定期调用。

于 2016-02-02T12:42:16.540 回答