Moved QApplication and QGuiApplication testing into separate threads

This commit is contained in:
Andrew Murray 2018-08-04 23:21:43 +10:00
parent f58f690835
commit dad0fd6d38
4 changed files with 36 additions and 20 deletions

View File

@ -7,9 +7,11 @@ from PIL import ImageQt
class TestFromQPixmap(PillowQPixmapTestCase, PillowTestCase): class TestFromQPixmap(PillowQPixmapTestCase, PillowTestCase):
def roundtrip(self, expected): def roundtrip(self, expected):
result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected)) def test():
# Qt saves all pixmaps as rgb result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected))
self.assert_image_equal(result, expected.convert('RGB')) # Qt saves all pixmaps as rgb
self.assert_image_equal(result, expected.convert('RGB'))
self.executeInSeparateProcess(test)
def test_sanity_1(self): def test_sanity_1(self):
self.roundtrip(hopper('1')) self.roundtrip(hopper('1'))

View File

@ -60,10 +60,12 @@ class TestToQImage(PillowQtTestCase, PillowTestCase):
self.assert_image_equal(reloaded, src) self.assert_image_equal(reloaded, src)
def test_segfault(self): def test_segfault(self):
app = QApplication([]) def test():
ex = Example() app = QApplication([])
assert(app) # Silence warning ex = Example()
assert(ex) # Silence warning assert(app) # Silence warning
assert(ex) # Silence warning
self.executeInSeparateProcess(test)
if ImageQt.qt_is_installed: if ImageQt.qt_is_installed:

View File

@ -10,15 +10,17 @@ if ImageQt.qt_is_installed:
class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase): class TestToQPixmap(PillowQPixmapTestCase, PillowTestCase):
def test_sanity(self): def test_sanity(self):
for mode in ('1', 'RGB', 'RGBA', 'L', 'P'): def test():
data = ImageQt.toqpixmap(hopper(mode)) for mode in ('1', 'RGB', 'RGBA', 'L', 'P'):
data = ImageQt.toqpixmap(hopper(mode))
self.assertIsInstance(data, QPixmap) self.assertIsInstance(data, QPixmap)
self.assertFalse(data.isNull()) self.assertFalse(data.isNull())
# Test saving the file # Test saving the file
tempfile = self.tempfile('temp_{}.png'.format(mode)) tempfile = self.tempfile('temp_{}.png'.format(mode))
data.save(tempfile) data.save(tempfile)
self.executeInSeparateProcess(test)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -2,6 +2,7 @@ from helper import unittest, PillowTestCase, hopper
from PIL import ImageQt from PIL import ImageQt
import multiprocessing
if ImageQt.qt_is_installed: if ImageQt.qt_is_installed:
from PIL.ImageQt import qRgba from PIL.ImageQt import qRgba
@ -18,6 +19,21 @@ class PillowQtTestCase(object):
def setUp(self): def setUp(self):
skip_if_qt_is_not_installed(self) skip_if_qt_is_not_installed(self)
def executeInSeparateProcess(self, test):
def target():
if ImageQt.qt_version == '5':
from PyQt5.QtGui import QGuiApplication
elif ImageQt.qt_version == '4':
from PyQt4.QtGui import QGuiApplication
elif ImageQt.qt_version == 'side':
from PySide.QtGui import QGuiApplication
app = QGuiApplication([])
test()
app.quit()
p = multiprocessing.Process(target=target)
p.start()
p.join()
def tearDown(self): def tearDown(self):
pass pass
@ -36,12 +52,6 @@ class PillowQPixmapTestCase(PillowQtTestCase):
except ImportError: except ImportError:
self.skipTest('QGuiApplication not installed') self.skipTest('QGuiApplication not installed')
self.app = QGuiApplication([])
def tearDown(self):
PillowQtTestCase.tearDown(self)
self.app.quit()
class TestImageQt(PillowQtTestCase, PillowTestCase): class TestImageQt(PillowQtTestCase, PillowTestCase):