Skip to content

Releases: PlotPyStack/PythonQwt

v0.16.0

03 May 11:00
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Performance

  • Major performance optimizations addressing Issue #93 (rendering performance degradation with Qt 6, also benefitting Qt 5):
    • QwtText: removed unnecessary QObject inheritance and added a font key cache to avoid expensive QFont hashing on every text rendering operation
    • QwtText: cached Qt alignment and text format flags as plain integers to bypass PyQt6 enum overhead in hot paths
    • QwtText: enabled font key caching fast path for Qt 6, kept disabled for Qt 5 to preserve consistent text rendering
    • QwtGraphic and QwtPainterCommand: cached Qt flags as integers to reduce per-command overhead, especially under PyQt6
    • QwtScaleDraw, QwtScaleEngine, QwtScaleMap and QwtScaleDiv: micro-optimizations on the tick computation and coordinate transform code paths
  • Added benchmarking and visual regression scripts under scripts/ (bench_qt.ps1, bench_plotpy_loadtest.py, profile_loadtest.py, lineprofile_loadtest.py, capture_screenshots.py, diff_screenshots.py) to measure and validate rendering performance and correctness

Bug fixes

  • Merged PR #105: fixed legend icon being rendered incorrectly - thanks to @Adrian-B-Moreira
  • Fixed QPaintDevice warnings on DevicePixelRatio and DevicePixelRatioScaled metrics in QwtNullPaintDevice
  • Fixed integer division in QwtScaleEngine so that medium ticks are actually produced (previously, the medium tick step was truncated to zero in some configurations)
  • Fixed QwtScaleMap rectangle transform and degenerate scale handling (when source or destination interval has zero width)

Other changes

  • Internal refactor: removed unnecessary QObject inheritance from QwtText (QwtText instances are no longer QObject subclasses; this is an internal change with no impact on the public plotting API, but downstream code relying on Qt signals/slots on QwtText instances should be adapted)
  • Development workflow: replaced legacy .bat scripts with a unified scripts/run_with_env.py environment loader, refactored VS Code tasks, added coverage tasks and CI gating of PyPI deployment on the test suite passing
  • Documentation: updated README, Sphinx documentation, dependencies and added AI coding agent instructions

v0.15.0

24 Oct 14:11
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 0.15.0

  • Added support for QwtDateTimeScaleDraw and QwtDateTimeScaleEngine for datetime axis support (see QwtDateTimeScaleDraw and QwtDateTimeScaleEngine classes in the qwt module)
  • Improved font rendering for rotated text in QwtPlainTextEngine.draw method: disabled font hinting to avoid character misalignment in rotated text

v0.14.6

14 Sep 12:15

Choose a tag to compare

Version 0.14.6

  • Fixed Issue #100 - TypeError in QwtSymbol.drawSymbol method due to outdated renderSymbols call
  • Fixed Issue #101 - RuntimeWarning: overflow encountered in cast when plotting numpy.float32 curve data
  • Merged PR #103: [FIX] wrong handling of border.rectList with PySide6 backend - thanks to @martinschwinzerl

v0.14.5

12 Apr 08:39

Choose a tag to compare

Version 0.14.5

  • Merged PR #98: Fix legend still being visible after removed
  • Merged PR #99: Fix QRectF to QRect cast in QwtPainterClass.drawBackground

v0.14.4

22 Jan 13:56

Choose a tag to compare

Version 0.14.4

  • Fixed canvas rectangle type in drawItems method call in QwtPlot.drawCanvas (was causing a hard crash when printing to PDF a canvas with upstream PlotPy project)

v0.14.3

12 Jan 13:47

Choose a tag to compare

Version 0.14.3

  • Fixed Issue #94 - Different logarithmic scale behavior when compared to Qwt
  • Merged PR #91: Fix: legend now showing up when enabled later - thanks to @nicoddemus
  • Removed QwtPlotItem.setIcon and QwtPlotItem.icon methods (introduced in 0.9.0 but not used in PythonQwt)

v0.14.2

10 Dec 16:57

Choose a tag to compare

Version 0.14.2

  • Merged PR #89: fixed call to ScaleEngine.autoScale in QwtPlot.updateAxes (returned values were not used) - thanks to @nicoddemus
  • Merged PR #90: updated QwtLinearScaleEngine.autoScale method implementation to the latest Qwt version - thanks to @nicoddemus

v0.14.1

07 Nov 11:02

Choose a tag to compare

Version 0.14.1

  • Handled RuntimeError when running test_eventfilter.py on Ubuntu 22.04 (Python 3.12, PyQt5)
  • Fixed ResourceWarning: unclosed file in test_cpudemo.py (purely test issue)
  • Fixed segmentation fault in test_multidemo.py (purely test issue, related to test utility module qwt.tests.utils)
  • Update GitHub actions to use the latest versions of actions/checkout, actions/setup-python, ...

v0.14.0

06 Nov 12:09

Choose a tag to compare

Dropped support for Python 3.8

v0.12.7

01 Aug 10:13

Choose a tag to compare

  • Fixed random crashes (segfaults) on Linux related to conflicts between Qt and Python reference counting mechanisms:
    • This issue was only happening on Linux, and only with Python 3.12, probably due to changes in Python garbage collector behavior introduced in Python 3.12. Moreover, it was only triggered with an extensive test suite, such as the one provided by the PlotPy project.
    • The solution was to derive all private classes containing Qt objects from QObject instead of object, in order to let Qt manage the reference counting of its objects.
    • This change was applied to the following classes:
      • QwtLinearColorMap_PrivateData
      • QwtColumnSymbol_PrivateData
      • QwtDynGridLayout_PrivateData
      • QwtGraphic_PrivateData
      • QwtLegendLabel_PrivateData
      • QwtNullPaintDevice_PrivateData
      • QwtPlotCanvas_PrivateData
      • QwtPlotDirectPainter_PrivateData
      • QwtPlotGrid_PrivateData
      • QwtPlotLayout_PrivateData
      • QwtPlotMarker_PrivateData
      • QwtPlotRenderer_PrivateData
      • QwtPlot_PrivateData
      • QwtAbstractScaleDraw_PrivateData
      • QwtScaleDraw_PrivateData
      • QwtScaleWidget_PrivateData
      • QwtSymbol_PrivateData
      • QwtText_PrivateData
  • Removed deprecated code regarding PyQt4 compatibility