所以我偶然发现了一段时间无法解决的问题。我正在用C ++编写一个Qt应用程序,并且一直在MacOSX上开发,它运行良好。但是,当我在Windows中测试代码时,当我关闭或取消我拥有的QDialog孩子时,我遇到了以下访问冲突:
Unhandled exception at 0x5ce6b1ea (QtGuid4.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfeeefefa.
调试这个,我看到它在很多Qt api调用后崩溃,最终降到了QWindowSurface_Raster.cpp。这是它崩溃的Qt库代码:
#endif
{
QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft();
HDC widget_dc = widget->getDC();
QRect wbr = br.translated(-wOffset);
BitBlt(widget_dc, wbr.x(), wbr.y(), wbr.width(), wbr.height(),
/*CRASH HERE!*/ d->image->hdc, br.x() + offset.x(), br.y() + offset.y(), SRCCOPY);
widget->releaseDC(widget_dc);
}
最后这是我的代码,我称之为qdialog:
void MainWindow::prefDialog()
{
prefD = new PreferenceDialog(this);
prefD->exec();
} /* crashes here, after I hit cancel/ok on dialog and it leaves exec */
PreferenceDialog.h:
class PreferenceDialog : public QDialog
{
Q_OBJECT
public:
PreferenceDialog(QWidget *parent);
.....
PreferenceDialog.c
PreferenceDialog::PreferenceDialog(QWidget *parent) :
QDialog(parent)
{
....
connect(okayButton, SIGNAL(released()), this, SLOT(okayClicked()));
connect(addKeyButton, SIGNAL(released()), this, SLOT(addClicked()));
connect(cancelButton, SIGNAL(released()), this, SLOT(cancelClicked()));
....
我可以向您展示我的PreferenceDialog代码或任何其他代码,但我认为它会让事情变得臃肿。除了显示之外,PreferenceDialog没有做太多的事情,我也不会覆盖任何函数,比如exec()等。堆栈跟踪也非常臃肿所以我现在不会发布,它只是在exec()之后调用了一堆Qtguid4.dll完成,(大约10)直到它在QWindowRaster中发生崩溃。
如果需要任何其他信息,请告诉我。我在Qt很新,所以很难搞清楚,任何帮助都会非常感谢,谢谢!
答案 0 :(得分:4)
我正在调用QDialog :: destroy()关闭窗口而不是QDialog :: close()。当Qt完成QDialog :: exec()并导致Windows崩溃时,这会导致空指针异常。将调用更改为close()可以解决问题。
感谢HostileFork的建议