# Created By: Virgil Dupras # Created On: 2009-05-23 # Copyright 2013 Hardcoded Software (http://www.hardcoded.net) # # This software is licensed under the "BSD" License as described in the "LICENSE" file, # which should be included with this package. The terms are also available at # http://www.hardcoded.net/licenses/bsd_license import traceback import sys import os from PyQt5.QtCore import Qt, QUrl, QCoreApplication, QSize from PyQt5.QtGui import QDesktopServices from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPlainTextEdit, QPushButton, QApplication) from hscommon.trans import trget from .util import horizontalSpacer tr = trget('qtlib') class ErrorReportDialog(QDialog): def __init__(self, parent, error, **kwargs): flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint super().__init__(parent, flags, **kwargs) self._setupUi() name = QCoreApplication.applicationName() version = QCoreApplication.applicationVersion() errorText = "Application Name: {0}\nVersion: {1}\n\n{2}".format(name, version, error) # Under windows, we end up with an error report without linesep if we don't mangle it errorText = errorText.replace('\n', os.linesep) self.errorTextEdit.setPlainText(errorText) self.sendButton.clicked.connect(self.accept) self.dontSendButton.clicked.connect(self.reject) def _setupUi(self): self.setWindowTitle(tr("Error Report")) self.resize(553, 349) self.verticalLayout = QVBoxLayout(self) self.label = QLabel(self) self.label.setText(tr("Something went wrong. Would you like to send the error report to Hardcoded Software?")) self.label.setWordWrap(True) self.verticalLayout.addWidget(self.label) self.errorTextEdit = QPlainTextEdit(self) self.errorTextEdit.setReadOnly(True) self.verticalLayout.addWidget(self.errorTextEdit) msg = tr("Although the application should continue to run after this error, it may be in an " "instable state, so it is recommended that you restart the application.") self.label2 = QLabel(msg) self.label2.setWordWrap(True) self.verticalLayout.addWidget(self.label2) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.addItem(horizontalSpacer()) self.dontSendButton = QPushButton(self) self.dontSendButton.setText(tr("Don\'t Send")) self.dontSendButton.setMinimumSize(QSize(110, 0)) self.horizontalLayout.addWidget(self.dontSendButton) self.sendButton = QPushButton(self) self.sendButton.setText(tr("Send")) self.sendButton.setMinimumSize(QSize(110, 0)) self.sendButton.setDefault(True) self.horizontalLayout.addWidget(self.sendButton) self.verticalLayout.addLayout(self.horizontalLayout) def accept(self): text = self.errorTextEdit.toPlainText() url = QUrl("mailto:support@hardcoded.net?SUBJECT=Error Report&BODY=%s" % text) QDesktopServices.openUrl(url) super().accept() def install_excepthook(): def my_excepthook(exctype, value, tb): s = ''.join(traceback.format_exception(exctype, value, tb)) dialog = ErrorReportDialog(None, s) dialog.exec_() sys.excepthook = my_excepthook if __name__ == '__main__': app = QApplication([]) QCoreApplication.setOrganizationName('Hardcoded Software') QCoreApplication.setApplicationName('FooApp') QCoreApplication.setApplicationVersion('1.2.3') dialog = ErrorReportDialog(None, 'some traceback') dialog.show() sys.exit(app.exec_())