- Added support for
QwtDateTimeScaleDrawandQwtDateTimeScaleEnginefor datetime axis support (seeQwtDateTimeScaleDrawandQwtDateTimeScaleEngineclasses in theqwtmodule) - Improved font rendering for rotated text in
QwtPlainTextEngine.drawmethod: disabled font hinting to avoid character misalignment in rotated text
- Fixed Issue #100 - TypeError in
QwtSymbol.drawSymbolmethod due to outdatedrenderSymbolscall - Fixed Issue #101 -
RuntimeWarning: overflow encountered in castwhen plottingnumpy.float32curve data - Merged PR #103: [FIX] wrong handling of
border.rectListwith PySide6 backend - thanks to @martinschwinzerl
- Merged PR #98: Fix legend still being visible after removed
- Merged PR #99: Fix
QRectFtoQRectcast inQwtPainterClass.drawBackground
- Fixed canvas rectangle type in
drawItemsmethod call inQwtPlot.drawCanvas(was causing a hard crash when printing to PDF a canvas with upstreamPlotPyproject)
- 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.setIconandQwtPlotItem.iconmethods (introduced in 0.9.0 but not used in PythonQwt)
- Merged PR #89: fixed call to
ScaleEngine.autoScaleinQwtPlot.updateAxes(returned values were not used) - thanks to @nicoddemus - Merged PR #90: updated
QwtLinearScaleEngine.autoScalemethod implementation to the latest Qwt version - thanks to @nicoddemus
- Handled
RuntimeErrorwhen runningtest_eventfilter.pyon Ubuntu 22.04 (Python 3.12, PyQt5) - Fixed
ResourceWarning: unclosed fileintest_cpudemo.py(purely test issue) - Fixed segmentation fault in
test_multidemo.py(purely test issue, related to test utility moduleqwt.tests.utils) - Update GitHub actions to use the latest versions of actions/checkout, actions/setup-python, ...
- Dropped support for Python 3.8
- 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
PlotPyproject. - The solution was to derive all private classes containing Qt objects from
QObjectinstead ofobject, in order to let Qt manage the reference counting of its objects. - This change was applied to the following classes:
QwtLinearColorMap_PrivateDataQwtColumnSymbol_PrivateDataQwtDynGridLayout_PrivateDataQwtGraphic_PrivateDataQwtLegendLabel_PrivateDataQwtNullPaintDevice_PrivateDataQwtPlotCanvas_PrivateDataQwtPlotDirectPainter_PrivateDataQwtPlotGrid_PrivateDataQwtPlotLayout_PrivateDataQwtPlotMarker_PrivateDataQwtPlotRenderer_PrivateDataQwtPlot_PrivateDataQwtAbstractScaleDraw_PrivateDataQwtScaleDraw_PrivateDataQwtScaleWidget_PrivateDataQwtSymbol_PrivateDataQwtText_PrivateData
- 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
- Removed deprecated code regarding PyQt4 compatibility
-
Fixed random crashes (segfaults) on Linux related to Qt objects stored in cache data structures (
QwtTextandQwtSymbol) -
Test suite can simply be run with
pytestand specific configuration (conftest.py) will be taken into account (previously, the test suite has to be run withpytest qwtin order to be successfully configured)
- Add support for NumPy 2.0:
- Use
numpy.asarrayinstead ofnumpy.array(..., copy=False) - Update requirements to remove the NumPy version upper bound constraint
- Use
- Fixed segmentation fault issue reported in the
PlotPyproject:- See PlotPy's Issue #13 for the original issue.
- The issue was caused by the
QwtSymbolclass constructor, and more specifically by its private data object, which instanciated an emptyQtPainterPathobject, causing a segmentation fault on Linux, Python 3.12 and PyQt5.
- Fixed
Fatal Python errorissue reported in thePlotPyproject:- See PlotPy's Issue #11 for the original issue, even if the problem is not directly pointed out in the issue comments.
- The issue was caused by the
QwtAbstractScaleDrawcache mechanism, which was keeping references toQSizeFobjects that were deleted by the garbage collector at some point. This was causing a segmentation fault, but only on Linux, and only when executing thePlotPytest suite in a specific order. - Thanks to @yuzibo for helping to reproduce the issue and providing a test case, that is the
PlotPyDebian package build process.
For this release, test coverage is 72%.
- Preparing for NumPy V2 compatibility: this is a work in progress, as NumPy V2 is not yet released. In the meantime, requirements have been updated to exclude NumPy V2.
- Fix
QwtPlot.axisInterval(was raisingAttributeError) - Removed unnecessary dependencies (pytest-qt, pytest-cov)
- Moved
conftest.pyto project root - Project code formatting: using
ruffinstead ofblackandisort
- Fixed
ColorStops.stopsmethod (was returning a copy of the list of stops instead of the list itself)
- 30% performance improvement (measured by
qwt.tests.test_loadtest) by optimizing theQwtAbstractScaleDraw.tickLabelmethod:- Suppressed an unnecessary call to
QFont.textSize(which can be quite slow) - Cached the text size with the label
QwtTextobject
- Suppressed an unnecessary call to
- Added support for margins in
QwtPlot(see Issue #82):- Default margins are set to 0.05 (5% of the plot area) at each side of the plot
- Margins are adjustable for each plot axis using
QwtPlot.setAxisMargin(andQwtPlot.axisMarginto get the current value)
- Added an additional margin to the left of ticks labels: this margin is set to one character width, to avoid the labels to be truncated while keeping a tight layout
- Slighly improved the new flat style (see V0.7.0) by selecting default fonts
- API breaking change:
QwtLinearColorMap.colorStopsnow returns a list ofColorStopobjects instead of the list of stop values
- Fixed
TypeErroronQwtPlotLayout.minimumSizeHint
- Fixed remaining
QwtPainter.drawPixmapcall
- Dropped support for Python 3.7 and earlier
- Dropped support for PyQt4 and PySide2
- Removed unnecessary argument
numPointsinQwtSymbol.drawSymbolsandQwtSymbol.renderSymbolsmethods QwtPlotCanvas: fixedBackingStorefeature (paintAttribute)
- Qt6 support:
- Handled all occurences of deprecated
QWidget.getContentsMarginsmethod. - Removed references to NonCosmeticDefaultPen
- Fixed
QApplication.desktopAttributeError - Fixed
QPrinter.HighResolutionAttributeErroron Linux - Fixed
QPrinter.setColorModeAttributeErroron PyQt6/Linux - Fixed
QPrinter.setOrientationdeprecation issue - Fixed
QPrinter.setPaperSizedeprecation issue
- Handled all occurences of deprecated
- Improved unit tests:
- Ensure that tests are entirely executed before quitting (in unattended mode)
- Added more tests on
qwt.symbols - Added tests on
qwt.plot_renderer
qwt.plot_renderer: fixed resolution typeqwt.symbols: fixedQPointFtype mismatch- Removed CHM help file generation (obsolete)
- Issue #81 - Signal disconnection issue with PySide 6.5.3
- Issue #80 - Print to PDF: AttributeError: 'NoneType' object has no attribute 'getContentsMargins'
-
Issue #79 - TypeError: unexpected type 'QSize' (thanks to @luc-j-bourhis)
-
Moved project to the PlotPyStack organization.
-
Unit tests: added support for
pytestandcoverage(60% coverage as of today) -
Issue #74 - TypeError: QwtPlotDict.init() [...] with PySide 6.5.0
-
Issue #77 - AttributeError: 'XXX' object has no attribute '_QwtPlot__data'
-
Issue #72 - AttributeError: 'QwtScaleWidget' object has no attribute 'maxMajor' / 'maxMinor' / 'stepSize'
-
Issue #76 - [PySide] AttributeError: 'QwtPlotCanvas' object has no attribute 'Sunken'
-
Issue #63 - TypeError: 'PySide2.QtCore.QRect' object is not subscriptable
- Fixed type mismatch issues on Linux
- Added support for PyQt6.
- Added support for QtPy 2 and PySide6.
- Dropped support for Python 2.
- Curve plotting: added support for
numpy.float32data type.
- Added load test showing a large number of plots (eventually highlights performance issues).
- Fixed event management in
QwtPlotand removed unnecessaryQEvent.LayoutRequestemission inQwtScaleWidget(caused high CPU usage withguiqwt.ImageWidget). QwtScaleDiv: fixed ticks initialization when passing all arguments to constructor.- tests/image.py: fixed overriden
updateLegendsignature.
QwtPlot: set theautoReplotoption at False by default, to avoid time consuming implicit plot updates.- Added
QwtPlotItem.setIconandQwtPlotItem.iconmethod for setting and getting the icon associated to the plot item (as of today, this feature is not strictly needed in PythonQwt: this has been implemented for several use cases in higher level libraries (see PR #61). - Removed unused
QwtPlotItem.defaultIconmethod. - Added various minor optimizations for axes/ticks drawing features.
- Fixed
QwtPlot.canvasMapwhenaxisScaleDivreturns None. - Fixed alias
np.floatwhich is deprecated in NumPy 1.20.
- Fixed simple plot examples (setup.py & plot.py's doc page) following the introduction of the new QtPy dependency (Qt compatibility layer) since V0.8.0.
- Added new GUI-based test script
PythonQwt-py3to run the test launcher. - Added command-line options to the
PythonQwt-tests-py3script to run all the tests simultenously in unattended mode (--mode unattended) or to update all the screenshots (--mode screenshots). - Added internal scripts for automated test in virtual environments with both PyQt5 and PySide2.
- PySide2 support was significatively improved betwen PythonQwt V0.8.0 and V0.8.1 thanks to the new
qwt.qwt_curve.array2d_to_qpolygonffunction.
- Added PySide2 support: PythonQwt is now compatible with Python 2.7, Python 3.4+, PyQt4, PyQt5 and PySide2!
- Changed QwtPlotItem.detachItems signature: removed unnecessary "autoDelete" argument, initialiazing "rtti" argument to None (remove all items)
- Improved Qt universal support (PyQt5, ...)
-
Added convenience functions for creating usual objects (curve, grid, marker, ...):
QwtPlotCurve.makeQwtPlotMarker.makeQwtPlotGrid.makeQwtSymbol.makeQwtText.make
-
Added new test launcher with screenshots (automatically generated)
-
Removed
guidatadependency thanks to the new specific GUI-based test launcher -
Updated documentation (added more examples, using automatically generated screenshots)
-
QwtPlot: added "flatStyle" option, a PythonQwt-exclusive feature improving default plot style (without margin, more compact and flat look) -- option is enabled by default
-
QwtAbstractScaleDraw: added option to set the tick color lighter factor for each tick type (minor, medium, major) -- this feature is used with the new flatStyle option
-
Fixed obvious errors (+ poor implementations) in untested code parts
-
Major code cleaning and formatting
-
Fixed Python crash occuring at exit when deleting objects (Python 3 only)
-
Moved documentation to https://docs.readthedocs.io/
-
Added unattended tests with multiple versions of WinPython:
- WinPython-32bit-2.7.6.4
- WinPython-64bit-2.7.6.4
- WinPython-64bit-3.4.4.3
- WinPython-64bit-3.4.4.3Qt5
- WPy64-3680
- WPy64-3771
- WPy64-3830
-
Added PyQt4/PyQt5/PySide automatic switch depending on installed libraries
- Fixed rounding issue with PythonQwt scale engine (0...1000 is now divided in 200-size steps, as in both Qwt and PyQwt)
- Removed unnecessary mask on scaleWidget (this closes #35)
- CurveBenchmark.py: fixed TypeError with numpy.linspace (NumPy=1.18)
- Ported changes from Qwt 6.1.2 to Qwt 6.1.5
QwtPlotCanvas.setPaintAttribute: fixed PyQt4 compatibility issue for BackingStore paint attribute- Fixed DataDemo.py test script (was crashing ; this closes #41)
QwtPainterClass.drawBackground: fixed obvious bug in untested code (this closes #51)qwtFillBackground: fixed obvious bug in untested code (this closes #50)QwtPainterClass.fillPixmap: fixed obvious bug in untested code (this closes #49)QwtStyleSheetRecorder: fixed obvious bug in untested code (this closes #47, closes #48 and closes #52)- Added "plot without margins" test for Issue #35
QwtScaleMap.invTransform_scalar: avoid divide by 0- Avoid error when computing ticks: when the axis was so small that no tick could be drawn, an exception used to be raised
Fixed an annoying bug which caused scale widget (axis ticks in particular) to be misaligned with canvas grid: the user was forced to resize the plot widget as a workaround
- Better handling of infinity and
NaNvalues in scales (removedNumPywarnings) - Now handling infinity and
NaNvalues in series data: removing points that can't be drawn - Fixed logarithmic scale engine: presence of values <= 0 was slowing down series data plotting
- Added CHM documentation to wheel package
- Fixed
QwtPlotRenderer.setDiscardFlag/setLayoutFlagargs - Fixed
QwtPlotItem.setItemInterestargs - Fixed
QwtPlot.setAxisAutoScale/setAutoReplotargs
- Fixed Issue #22: fixed scale issues in CurveDemo2.py and ImagePlotDemo.py
QwtPlotCurve: sticks were not drawn correctly depending on orientationQwtInterval: avoid overflows withNumPyscalars- Fixed Issue #28: curve shading was broken since v0.5.0
- setup.py: using setuptools "entry_points" instead of distutils "scripts"
- Showing curves/plots number in benchmarks to avoid any misinterpretation (see Issue #26)
- Added Python2/Python3 scripts for running tests
- Various optimizations
- Major API simplification, taking into account the feature that won't be implemented (fitting, rounding, weeding out points, clipping, etc.)
- Added
QwtScaleDraw.setLabelAutoSize/labelAutoSizemethods to set the new auto size option (see documentation) QwtPainter: removed unused methodsdrawRoundFrame,drawImageanddrawPixmap
- Color bar: fixed axis ticks shaking when color bar is enabled
- Fixed
QwtPainter.drawColorBarfor horizontal color bars (typo) - Restored compatibility with original Qwt signals (
QwtPlot, ...)
Renamed the project (python-qwt --> PythonQwt), for various reasons.
Fixed Issue #23: "argument numPoints is not implemented" error was showing up when calling QwtSymbol.drawSymbol(symbol, QPoint(x, y)).
Added docstrings in all Python modules and a complete documentation based on Sphinx. See the Overview section for API limitations when comparing to Qwt.
Fixed Issue #21 (blocking issue only on non-Windows platforms when building the package): typo in "PythonQwt-tests" script name (in setup script)
First alpha public release.