大家好,
我正在使用以下代码打开和显示 html 内容。
void MyClass::playHtml(QString filePath, int w, int h) {
QUrl url = QUrl::fromLocalFile(filePath);
mWidget = new QWebView(this);
mWidget->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
mWidget->page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
mWidget->setGeometry(0, 0, width(), height());
float h_scale = (float) height() / h;
float w_scale = (float) width() / w;
float zoom = 1.0;
if (h_scale < w_scale) {
zoom = h_scale;
} else {
zoom = w_scale;
}
mWidget->setZoomFactor(zoom);
mWidget->load(url);
mWidget->show();
}
要复制到剪贴板,请将视图切换到纯文本模式
这是在 MyClass 内部,它设置自己的几何图形,并且此函数QWebView
适当地缩放以保持纵横比。删除mWidget(QWebView pointer)
MyClass 对象时将调用 的删除。以下是它的调用过程。
1.) MyClass 被实例化为“mclass”。
2.) 实例化后,在mclass对象上调用上面的playHtml方法
3.) 上面的 playHtml 方法获取位于独立文件夹中的 html 文件的完整路径,w/h 是用于缩放的 html 内容的预定尺寸
4.) 大约 25 秒后,mclass 对象被删除
4a.) 在这 25 秒内,playHtml 方法适当地缩放 html 内容,并加载 html 文件。动画等发生了很多javascript。
5.) 删除后发生 MyClass 的另一个实例化并重复该过程
这个过程一天可以重复3000次,一个接一个。在此期间,cpu 和 ram 均不征税。我在上面的过程中唯一遗漏的是日志记录。我安装了一个 MessageHandler 来记录 qDebug 和其他消息。
这是我在上述过程运行一段时间后(从几个小时到几天)在日志中看到的内容。
每个“MyClass”实例都有一堆这些:
CRITICAL: QWindowsBackingStore::flush: GetDC failed ()
然后是每个“MyClass”实例中的一堆:
CRITICAL: QWindowsBackingStore::flush: BitBlt failed ()
紧随其后的是崩溃。
在事件查看器中,我收到崩溃“错误”消息。它始终位于这些故障模块之一 MSVCR100.dll 或 Qt5Webkit 或 Qt5WebkitWidget dll 之一中。
我没有专门画任何东西。我依靠 QWebView 来做到这一点——无论是绘制本身还是它包含的内容。除非上述情况开始发生,否则它做得很好。除了软件之外,机器上没有其他任何东西在运行。
如何检测这样的错误?在这一点上,在他们到达日志之前,我对他们一无所知。我想在那之前检测并处理它们,但不确定如何。作为旁注,我想借此机会了解更多关于 Qt 和 C++ 的一般错误检测的信息。首先,我如何检测似乎在食物链上游发生的此类错误。我担心我被 Java/C# 提供的堆栈跟踪宠坏了。
环境信息:
- Windows 7 专业版 64 位
- Qt 5.2.1(32 位)
- 使用VS2010编译
谢谢!
-杰森