• 2937阅读
  • 1回复

QT 4.86的connect有问题? [复制链接]

上一主题 下一主题
离线stlcours
 

只看楼主 倒序阅读 楼主  发表于: 2014-09-05
我有个QT5.31的小工程,在VS2010和VS2012下编译运行都没有任何问题。但是我想把它迁移到VS2008+4.86下去,因为这样更轻量级,且4.86是QT4的最后一个版本,应该是经典版本,Bug很少才对。整个工程我就改了一处代码,就是connect语法变了,从:
connect(network_manager, &QNetworkAccessManager::finished, this, &LoginDialog::ReadXML);
变成:
connect(network_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(ReadXML(QNetworkReply*)));
VS2008顺利编译通过,运行也有相应的效果。但是效果显示之后,提示有问题:
Unhandled exception at 0x66fdf3b1 (QtCored4.dll) in NeobeV6.exe: 0xC0000005: Access violation reading location 0xfeeefefa.

点击Break按钮,停在:
struct Q_CORE_EXPORT QListData {
    inline int size() const { return d->end - d->begin; }
}
后来我追踪了一下,结果是C:\Qt\4.8.6_2008\src\network\access\qnetworkreplyimpl.cpp 的 QNetworkReplyImplPrivate::finished() 函数的最后一句语句有问题:
void QNetworkReplyImplPrivate::finished() {
   // 其它语句
    resumeNotificationHandling(); // 这句!!!
}
看着名字,还是应该与connect的语法有关系,请各位大大指教一下,非常感谢!
离线stlcours

只看该作者 1楼 发表于: 2014-09-05
问题解决,关键这这句话:
http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html#finished
Note: Do not delete the reply object in the slot connected to this signal. Use deleteLater().

但是还是有点奇怪,明明QT5的文档里这么说,却可以不这么做,运行没问题。我是这样写的:
void LoginDialog::ReadXML(QNetworkReply *reply) {

  delete reply;
}
同样的写法,QT4里直接就报错。必须改成:reply->deleteLater();
快速回复
限100 字节
 
上一个 下一个