我应该在哪里重新实现 QApplication::notify 函数?
Posted
技术标签:
【中文标题】我应该在哪里重新实现 QApplication::notify 函数?【英文标题】:Where am I supposed to reimplement QApplication::notify function? 【发布时间】:2012-12-14 12:06:34 【问题描述】:我的意思是,哪个班?我自己的类之一或 Qt 的一些类的子类并在那里做?我需要这个,因为从服务器下载文件时出现以下错误(小文件下载正常,但大文件会导致此消息):
Qt 已经捕获了一个事件处理程序抛出的异常。投掷 Qt 不支持来自事件处理程序的异常。你必须 重新实现 QApplication::notify() 并在那里捕获所有异常。
【问题讨论】:
嗨,看看这是否有帮助:qt-project.org/forums/viewthread/17731。在那里,他们继承QtApplication
并在SafeApplication
中重新实现notify
方法。
#AdriC.S.嗨,我不确定是不是这样,但我会试一试。
您确定要从事件处理程序中抛出异常吗?你将如何处理它们?
@Lol4t0 这是一个有点误导性的错误,发生的情况是在一个槽中抛出了一个异常,该异常向上传播,直到它到达 Qt 的事件队列处理器——它就是显示错误的那个。跨度>
【参考方案1】:
只需继承 QApplication
并在您的 notify(..)
方法中执行以下操作:
try
return QApplication::notify( receiver, event );
catch ( std::exception& e )
showAngryDialog( e );
return false;
然后在你的主函数中使用它而不是QApplication
。
【讨论】:
#cmannett85 嗨,这确实成功了。 'e' 是一个 std::bad_alloc。知道这是什么鬼吗?我需要增加堆吗? @user336359 要么你试图分配一个荒谬的内存量,要么你在低资源/嵌入式系统上运行 Qt。 很可能是前者。我正在做的是我正在下载文件,并且我已将信号连接到插槽: QNetworkReply* reply = network_access_manager_->get(request); connect(reply,SIGNAL(downloadProgress(qint64,qint64)),parent_->getProgressBar(),SLOT(downloadProgress(qint64,qint64))); #cmannett85 不仅如此,当文件很小的时候下载是成功的,但是当有 1GB 的下载停止在 73% 时,如果我不连接这些插槽,或者如果我不连接这些插槽,程序会因 bad_alloc 而崩溃连接这些插槽。 @user336359 好吧,如果您遇到问题,请发布另一个问题。【参考方案2】:如前所述,创建您自己的应用程序对象,该对象继承自 QtApplication 并重新定义“通知”。这是要走的路。但是请务必使用此构造函数:
MyApplication::MyApplication(int &argc, char *argv[]);
使用 '&' 将 argc 设置为引用很重要,因为它可以避免在某些平台上崩溃。
这里描述了完整的过程:http://qt-project.org/forums/viewthread/17731
我自己的实现:
class MyApplication : public QApplication
public:
MyApplication(int &argc, char ** argv);
// ~MyApplication();
private:
bool notify(QObject *receiver_, QEvent *event_);
;
(上述崩溃发生在 Ubuntu 13.10 64 位上,但在 12.04 64 位版本上不存在。)
【讨论】:
关于使用int &
的评论真的帮助了我。在我这样做之前,我的应用程序一直崩溃。以上是关于我应该在哪里重新实现 QApplication::notify 函数?的主要内容,如果未能解决你的问题,请参考以下文章
完全删除 QApplication 实例并在另一个线程中重新创建它
GWT:刷新页面会导致整个 Web 应用程序重新启动。我应该在哪里保存状态?
我的精神分裂症控制台/gui Qt5 程序应该使用 QApplication 还是 QCoreApplication?