23
23
QgsProject ,
24
24
QgsFeature ,
25
25
QgsGeometry ,
26
- QgsMapSettings )
26
+ QgsMapSettings ,
27
+ QgsPoint )
27
28
from qgis .testing import start_app , unittest
28
29
from qgis .PyQt .QtCore import QSize , QThreadPool
29
30
from qgis .PyQt .QtGui import QPainter , QImage
31
+ from qgis .PyQt .QtTest import QSignalSpy
32
+ from random import uniform
33
+
30
34
31
35
app = start_app ()
32
36
@@ -378,6 +382,51 @@ def checkLabeledLayerWithBlendModesCannotBeCached(self, job_type):
378
382
self .assertFalse (cache .hasCacheImage ('_labels_' ))
379
383
self .assertTrue (job .takeLabelingResults ())
380
384
385
+ def checkCancel (self , job_type ):
386
+ """test canceling a render job"""
387
+ layer = QgsVectorLayer ("Point?field=fldtxt:string" ,
388
+ "layer1" , "memory" )
389
+
390
+ # add a ton of random points
391
+ for i in range (2000 ):
392
+ x = uniform (5 , 25 )
393
+ y = uniform (25 , 45 )
394
+ g = QgsGeometry .fromPoint (QgsPoint (x , y ))
395
+ f = QgsFeature ()
396
+ f .setGeometry (g )
397
+ f .initAttributes (1 )
398
+ layer .dataProvider ().addFeatures ([f ])
399
+
400
+ settings = QgsMapSettings ()
401
+ settings .setExtent (QgsRectangle (5 , 25 , 25 , 45 ))
402
+ settings .setOutputSize (QSize (600 , 400 ))
403
+ settings .setLayers ([layer ])
404
+
405
+ # first try non-blocking cancelWithoutBlocking() call
406
+ job = job_type (settings )
407
+ finished_spy = QSignalSpy (job .finished )
408
+ job .start ()
409
+
410
+ # insta cancel!
411
+ job .cancelWithoutBlocking ()
412
+ # should still be active immediately after
413
+ self .assertTrue (job .isActive ())
414
+
415
+ while job .isActive ():
416
+ app .processEvents ()
417
+ self .assertEqual (len (finished_spy ), 1 )
418
+
419
+ # try blocking cancel() call
420
+ job = job_type (settings )
421
+ finished_spy = QSignalSpy (job .finished )
422
+ job .start ()
423
+
424
+ # insta cancel!
425
+ job .cancel ()
426
+ # should not be active anymore
427
+ self .assertFalse (job .isActive ())
428
+ self .assertEqual (len (finished_spy ), 1 )
429
+
381
430
def runRendererChecks (self , renderer ):
382
431
""" runs all checks on the specified renderer """
383
432
self .checkRendererUseCachedLabels (renderer )
@@ -388,6 +437,7 @@ def runRendererChecks(self, renderer):
388
437
self .checkAddingNewNonLabeledLayerKeepsLabelCache (renderer )
389
438
self .checkRemovingNonLabeledLayerKeepsLabelCache (renderer )
390
439
self .checkLabeledLayerWithBlendModesCannotBeCached (renderer )
440
+ self .checkCancel (renderer )
391
441
392
442
def testParallelRenderer (self ):
393
443
""" run test suite on QgsMapRendererParallelJob"""
0 commit comments