それで、しばらく解決できない問題に遭遇しました。私はC++でQtアプリケーションを作成しており、MacOSXで開発を行っています。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が呼び出されるだけです。 QWindowRasterでクラッシュするまで、(約10)終了します。
他に必要な情報があれば教えてください。私はQtでかなり新しいので、これを理解するのに苦労しているので、どんな助けでも大歓迎です、ありがとう!