所以我偶然发现了一个我无法解决的问题.我正在用C编写一个Qt应用程序,并且已经在MacOSX上进行开发,它运行良好.但是,当我在
Windows中测试代码时,当我关闭或取消我拥有的QDialog子时,我遇到了以下访问冲突:
MyApp.exe中0x5ce6b1ea(QtGuid4.dll)的未处理异常:0xC0000005:访问冲突读取位置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,SLOT(addClicked())); connect(cancelButton,SLOT(cancelClicked())); ....
我可以向你展示我的PreferenceDialog代码或任何其他代码,但我认为它只是膨胀了. PreferenceDialog除了显示之外没有做太多的事情,我也不会覆盖任何函数,比如exec()等.堆栈跟踪也非常臃肿所以我现在不会发布,它只是在exec()之后调用了一堆Qtguid4.dll完成,(大约10)直到它在QWindowRaster中发生崩溃.
如果需要任何其他信息,请告诉我.我在Qt很新,所以很难搞清楚这一点,任何帮助都将不胜感激,谢谢!