[PyQt] PyQt_qreal_double (Was: Re: PyQt5 5.7.1 Bug: debug build on Windows broken)
phil at riverbankcomputing.com
Fri Jan 20 15:41:49 GMT 2017
On 19 Jan 2017, at 11:47 am, Dmitry Shachnev <mitya57 at ubuntu.com> wrote:
> Hi all,
> On Tue, Jan 17, 2017 at 06:33:31PM +0100, Hans-Peter Jansen wrote:
>>> We now have this patch in Debian too (thanks Pete!).
>> Hehe. Funnily, the fix_qreal_check.diff mentioned below in "openSUSE patches
>> of PyQt" is yours. Thank you, Dmitry. The world "feels" small sometimes.
>> You might want to comment on this, why Phil should consider your approach.
> We no longer have this patch in Debian because we switched to qreal = double
> on all architectures, however having this patch applied to mainstream PyQt
> would still make sense in my opinion.
> While qreal = double by default, it is still possible (and supported) to do
> a custom Qt build with qreal = float. As far as I know, Sailfish still has
> qreal = float, so it would be useful at least for them.
> I would also update the patch because the sizeof-based check can be applied
> always, not only for old Qt versions.
> However there are some inconsistencies in PyQt code. It seems quite naturally
> that PyQt_qreal_double tells that qreal *is* double. The code in qglobal.sip
> seems to agree with that definition:
> %If (PyQt_qreal_double)
> typedef double qreal;
> %If (!PyQt_qreal_double)
> typedef float qreal;
> However, the code in (unpatched) configure.py and qpygui_qvector.sip seems to
> be using the opposite logic. Here is a fragment from qpygui_qvector.sip:
> %If (PyQt_qreal_double)
> %MappedType QVector<qreal>
> /TypeHintIn="Iterable[float]", TypeHintOut="List[float]",
> I hope Phil can clarify what is correct and what is not.
If you are referring to "float" in the above, it is the Python float not the C++ float.
> A potential updated patch for configure.py that would agree with qglobal.sip
> code is below (note the '==' instead of '!=' which was in the initial patch).
> When applying this, the code in qpygui_qvector.sip should be either fixed or
> dropped altogether.
> To test the changes with qreal = float, qtbase should be configured with
> '-qreal float' option.
I assume this sets the QT_COORD_TYPE preprocessor symbol. Is it supported to do '-qreal int'?
> --- a/configure.py
> +++ b/configure.py
> @@ -687,13 +687,8 @@ int main(int argc, char **argv)
> out << "PyQt_Desktop_OpenGL\\n";
> -#if QT_VERSION < 0x050200
> -// This is the test used in qglobal.h in Qt prior to v5.2. In v5.2 and later
> -// qreal is always double.
> -#if defined(QT_NO_FPU) || defined(Q_PROCESSOR_ARM) || defined(Q_OS_WINCE)
> - out << "PyQt_qreal_double\\n";
> + if (sizeof (qreal) == sizeof (double))
> + out << "PyQt_qreal_double\\n";
> #if defined(QT_NO_PROCESS)
> out << "PyQt_Process\\n";
The values being generated are to *disable* those features and not enable them. So your patch does exactly the opposite of what you intended.
More information about the PyQt