diff --git a/.project b/.project
new file mode 100644
index 00000000..9a9fb502
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+
+
+ pytest-qt
+
+
+
+
+
+ org.python.pydev.PyDevBuilder
+
+
+
+
+
+ org.python.pydev.pythonNature
+
+
diff --git a/.pydevproject b/.pydevproject
new file mode 100644
index 00000000..a946dfc2
--- /dev/null
+++ b/.pydevproject
@@ -0,0 +1,8 @@
+
+
+
+/${PROJECT_DIR_NAME}
+
+python 2.7
+Default
+
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 3e447522..5ed80c56 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,3 +1,12 @@
+1.12.dev
+--------
+
+- Exceptions caught by ``pytest-qt`` in ``sys.excepthook`` are now also printed
+ to ``stderr``, making debugging them easier from within an IDE.
+ Thanks `@fabioz`_ for the PR (`126`_)!
+
+.. _126: https://github.com/pytest-dev/pytest-qt/pull/126
+
1.11.0
------
diff --git a/README.rst b/README.rst
index 32d649fa..f556dc36 100644
--- a/README.rst
+++ b/README.rst
@@ -149,6 +149,11 @@ Many thanks to:
.. |pycharm| image:: https://www.jetbrains.com/pycharm/docs/logo_pycharm.png
:target: https://www.jetbrains.com/pycharm
+.. |pydev| image:: http://www.pydev.org/images/pydev_banner3.png
+ :target: https://www.pydev.org
+
|pycharm|
+|pydev|
+
.. _tox: http://tox.readthedocs.org
diff --git a/pytestqt/exceptions.py b/pytestqt/exceptions.py
index f22cb2cc..90018a8b 100644
--- a/pytestqt/exceptions.py
+++ b/pytestqt/exceptions.py
@@ -34,6 +34,7 @@ def start(self):
"""
def hook(type_, value, tback):
self.exceptions.append((type_, value, tback))
+ sys.stderr.write(format_captured_exceptions([(type_, value, tback)]))
self.old_hook = sys.excepthook
sys.excepthook = hook
diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py
index bacd7919..4a5929ff 100644
--- a/tests/test_exceptions.py
+++ b/tests/test_exceptions.py
@@ -1,6 +1,6 @@
+from pytestqt.exceptions import capture_exceptions, format_captured_exceptions
import pytest
import sys
-from pytestqt.exceptions import format_captured_exceptions
@pytest.mark.parametrize('raise_error', [False, True])
@@ -244,3 +244,26 @@ def event(self, ev):
qapp.processEvents()
assert [str(e) for (t, e, tb) in exceptions] == ['mistakes were made']
+
+
+def test_exceptions_to_stderr(qapp, capsys):
+ """
+ Exceptions should still be reported to stderr.
+ """
+ called = []
+ from pytestqt.qt_compat import QWidget, QEvent
+
+ class MyWidget(QWidget):
+
+ def event(self, ev):
+ called.append(1)
+ raise RuntimeError('event processed')
+
+ w = MyWidget()
+ with capture_exceptions() as exceptions:
+ qapp.postEvent(w, QEvent(QEvent.User))
+ qapp.processEvents()
+ assert called
+ del exceptions[:]
+ _out, err = capsys.readouterr()
+ assert "raise RuntimeError('event processed')" in err
diff --git a/tox.ini b/tox.ini
index cedf99eb..fc80523c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -23,6 +23,7 @@ passenv=DISPLAY XAUTHORITY USERNAME
basepython=python2.7
deps=pytest
sphinx
+ sphinx_rtd_theme
changedir=docs
setenv=
READTHEDOCS=True