PyQt  - 讨论区

标题:注意PyQt的陷阱之一

2011年05月07日 星期六 01:05

Qt里面有一些要求用户不能直接用"delete"删除对象,而必须使用"deleteLater"的情况。比如QAbstractSocket的"disconnected()"这个信号的说明文字:

Warning: If you need to delete the sender() of this signal in a slot connected to it, use the deleteLater() function.

在Qt程序里面如果违反这个约定,很有可能就段错误了。在PyQt里面也会很糟糕。更不幸的是,因为Python的内存管理是自动的,很可能因为不小心就犯了错误。比如当连接中断的时候,就再创建一个QTcpSocket重连。这时,旧的连接引用数变成0,销毁了——相当delete。违反了上面那个警告。再比如写服务器的时候,客户端连接断开以后就从一个列表里面删除客户端相关的信息,如果连接也是客户端信息之一,又要出错了。

避免这个问题的方法,除了小心谨慎外。可以试试在连接信号与槽的时候特殊处理:

self.connection.disconnected.connect(self.onClientDisconnected, Qt.QueuedConnection)

2011年09月03日 星期六 12:14

        "比如当连接中断的时候,就再创建一个QTcpSocket重连。这时,旧的连接引用数变成0,销毁了——相当delete。"

       通常这种情况只需要将socket对象作为类的一个self成员保存并尽可能使用同一对象完成一组工作即可。  不过你说的这些确实容易出问题。

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号