Qt应用程序在MacOSX上运行良好,在Windows上访问冲突
所以我遇到了一个暂时无法解决的问题。我在C++中编写了QT应用程序,并在MaCOSX上开发,运行良好。但是,当我在windows中测试代码时,当我关闭或取消我拥有的QDialog子项时,我遇到了以下访问冲突:Qt应用程序在MacOSX上运行良好,在Windows上访问冲突,windows,qt,exception,qt4,access-violation,Windows,Qt,Exception,Qt4,Access Violation,所以我遇到了一个暂时无法解决的问题。我在C++中编写了QT应用程序,并在MaCOSX上开发,运行良好。但是,当我在windows中测试代码时,当我关闭或取消我拥有的QDialog子项时,我遇到了以下访问冲突: MyApp.exe中0x5ce6b1ea(QtGuid4.dll)处未处理的异常:0xc000005:访问冲突读取位置0xfeeefefa。 通过调试,我看到它在多次Qt api调用后崩溃,最终进入QWindowsSurface_Raster.cpp。以下是它崩溃的Qt库代码: #endi
MyApp.exe中0x5ce6b1ea(QtGuid4.dll)处未处理的异常:0xc000005:访问冲突读取位置0xfeeefefa。
通过调试,我看到它在多次Qt api调用后崩溃,最终进入QWindowsSurface_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除了显示的功能外,没有其他功能,我也不会重写任何函数,比如exec(),等等。堆栈跟踪也非常臃肿,所以我现在不会发布,它只是在exec()完成后(大约10次)调用一堆Qtguid4.dll,直到它在QWindowRaster中出现崩溃
如果需要任何其他信息,请告诉我。我是Qt的新手,所以很难弄明白这一点,任何帮助都将不胜感激,谢谢 我调用了QDialog::destroy()来关闭窗口,而不是QDialog::close()。这导致Qt在完成QDialog::exec()时出现空指针异常,并导致Windows崩溃。将调用更改为close()修复了该问题
谢谢霍斯蒂尔福克的建议你可以试试我的建议。我看到它对过去导致HDC相关内容的问题给出了一些反馈…它对我的具体问题没有帮助,但我肯定可以在其他领域使用它,感谢infoWell,它值得一试…如果你把它留在里面,我打赌它会在不久的将来为你节省一些时间。我把它放在每个项目中。前进…即使它涉及一些文件,你能提出一个最小的情况吗?只需从程序中删除按钮和代码行,直到崩溃消失。然后将其添加回,并重复该过程。你要么会发现问题,要么会有一些很短的东西,我们可以自己编译并复制它!啊,谢谢你的建议。。我不知道为什么我没有想到这一点,而不是试图通过所有的代码。结果是我调用destroy();而不是在取消对话框时关闭(),因此在我销毁它之后,它一定在exec中的某个位置调用了空指针。。。不知道为什么它没有在Mac上这样做,很难找到bug,谢谢!另外,StackOverflow的新功能。。我假设我应该用这些信息回答我自己的问题。。?