共享库事件循环问题中的 QApplication
QApplication Within A Shared Library Event Loop Issues
我正在尝试在共享库中使用 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;
}
exec
必须是 运行 一个胎面。或者,您可以定期调用 QApplication::processEvents
。
你的事件循环没有任何关系。您需要在调用 a.exec() 之前发出渲染文件请求,而不是之后。换句话说,您需要进行以下更改:
在 WebLib 构造函数中:
1. 删除对 a.exec() 的调用。
2. 动态分配QApplication,而不是将其放入堆栈。 3.去掉定时器,你不需要它。
在web_lib.cpp中:
添加 WebLib::run(),它将调用 a.exec().
在main.cpp中:
调用renderFile()后,调用webLib->运行().
As soon as I run qApp->exec()
the event loop completely blocks and prevents anything else from executing.
没错。完成渲染后,您应该退出事件循环。
计时器是无用的,因为从像 handleEvents
这样的非阻塞槽调用 processEvents
只会强制事件循环短时间重新进入,没有任何原因。
我正在尝试在共享库中使用 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;
}
exec
必须是 运行 一个胎面。或者,您可以定期调用 QApplication::processEvents
。
你的事件循环没有任何关系。您需要在调用 a.exec() 之前发出渲染文件请求,而不是之后。换句话说,您需要进行以下更改:
在 WebLib 构造函数中: 1. 删除对 a.exec() 的调用。 2. 动态分配QApplication,而不是将其放入堆栈。 3.去掉定时器,你不需要它。
在web_lib.cpp中: 添加 WebLib::run(),它将调用 a.exec().
在main.cpp中: 调用renderFile()后,调用webLib->运行().
As soon as I run
qApp->exec()
the event loop completely blocks and prevents anything else from executing.
没错。完成渲染后,您应该退出事件循环。
计时器是无用的,因为从像 handleEvents
这样的非阻塞槽调用 processEvents
只会强制事件循环短时间重新进入,没有任何原因。