4

所以我偶然发现了一个我暂时无法解决的问题。我正在用 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 */

首选项对话框.h:

class PreferenceDialog : public QDialog
{
    Q_OBJECT

public:
    PreferenceDialog(QWidget *parent);
.....

首选项对话框.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 的新手,所以很难弄清楚这一点,任何帮助将不胜感激,谢谢!

4

1 回答 1

4

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

感谢 HostileFork 的建议

于 2012-10-03T17:23:53.517 回答