加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:28:00 所属栏目:Windows 来源:网络整理
导读:所以我偶然发现了一个我无法解决的问题.我正在用C编写一个Qt应用程序,并且已经在MacOSX上进行开发,它运行良好.但是,当我在 Windows中测试代码时,当我关闭或取消我拥有的QDialog子时,我遇到了以下访问冲突: MyApp.exe中0x5ce6b1ea(QtGuid4.dll)的未处理异常
所以我偶然发现了一个我无法解决的问题.我正在用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很新,所以很难搞清楚这一点,任何帮助都将不胜感激,谢谢!

解决方法

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

感谢HostileFork的建议

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读