从 Qt5Widgets 调用 setFixedSize() 时出现未处理的异常

Posted

技术标签:

【中文标题】从 Qt5Widgets 调用 setFixedSize() 时出现未处理的异常【英文标题】:Unhandled exception while calling setFixedSize() from Qt5Widgets 【发布时间】:2016-07-20 09:52:50 【问题描述】:

我正在使用 Visual Studio 中的 Qt 库开发代码。 我有一个 A 类作为 Qt 类的子类。

class A::A(QWidget *parent, QGLWidget *shareWidget) : QGLWidget(parent, shareWidget)

这个类的一个成员函数是:

void A::setImage(Image *image)

    m_image = image;
    setFixedSize(image->width(), image->height());

(其中setFixedSize是父类QWidget的方法)

在以下事件中从另一个类调用此方法:

bool B::event(QEvent* e)

    QWidget::event(e);
    ...

    A instA = new A();
    instA.setImage(*image)
    ...


在 setFixedSize 处引发以下异常,尽管传递的值是真正的普通 int,例如 width = height = 500。

Unhandled exception at 0x54A6B056 (Qt5Widgetsd.dll):
0xC0000005: Access violation reading location 0x939394BC.

这个方法 setImage 在运行代码时被调用了好几次,而且效果很好。问题仅出现在 B::event(QEvent* e) 中。

PS:此时该方法不起作用,即使我直接传递诸如 setFixedSize(500, 500) 之类的常量值。

期待任何建议。

【问题讨论】:

请改进您的问题(另见MCVE),尤其是:完成setImage 函数签名,显示B::event 的完整实现并提供完整的堆栈跟踪。 【参考方案1】:
A instA = new A();
instA.setImage(*image)

这在我看来很荒谬。能否请给出准确的编译代码。

其次,在使用pointers时,请确保它们不是null

所以你的函数应该是这样的-

void A::setImage(Image *image)

   if(image)  //Null check, it will enter to block only if image is not null
   
    m_image = image;
    setFixedSize(image->width(), image->height());
   

【讨论】:

此时指针不为空。那一刻我可以读到。我什至确实看到了传递给 setFixedSize() 的值。但我应该承认我没有很好地总结我的代码。我应该编辑它。

以上是关于从 Qt5Widgets 调用 setFixedSize() 时出现未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章

无法启动此程序,因为计算机中丢失Qt5Widgets.dll.尝试重新安装该程序以解决此问题

文件操作示例脚本 tcl

在悬停事件时激活 QPainter

Pyqt5_QWidget

openssl 和libcurl的安装

在新机器部署Qt+mysql程序