我应该在哪里重新实现 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 应用程序重新启动。我应该在哪里保存状态?

在 Redux 中我应该在哪里编写复杂的异步流?

我的精神分裂症控制台/gui Qt5 程序应该使用 QApplication 还是 QCoreApplication?

Python Qt GUI设计:5种事件处理机制(提升篇—3)

Python Qt GUI设计:5种事件处理机制(提升篇—3)