Qt App适用于MacOSX,Windows上的访问冲突

时间:2012-10-03 03:36:31

标签: windows qt exception qt4 access-violation

所以我偶然发现了一段时间无法解决的问题。我正在用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很新,所以很难搞清楚,任何帮助都会非常感谢,谢谢!

1 个答案:

答案 0 :(得分:4)

我正在调用QDialog :: destroy()关闭窗口而不是QDialog :: close()。当Qt完成QDialog :: exec()并导致Windows崩溃时,这会导致空指针异常。将调用更改为close()可以解决问题。

感谢HostileFork的建议