1

使用 PyQt4,我一直能够使用 None 作为参数初始化 QBrush 和 QColor(不创建颜色等):

QBrush(None)
QColor(None)

但是在我从 4.11.3 升级到 4.11.4(这是一个小升级)之后,我发现这些不再被接受:

>>> QColor(None)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: arguments did not match any overloaded call:
  QColor(Qt.GlobalColor): argument 1 has unexpected type 'NoneType'
  QColor(int): too many arguments
  QColor(QVariant): argument 1 has unexpected type 'NoneType'
  QColor(): argument 1 has unexpected type 'NoneType'
  QColor(int, int, int, int alpha=255): argument 1 has unexpected type 'NoneType'

我试图搜索 4.11.3 和 4.11.4 之间的更改,但看不到任何解释这一点的相关信息。我开始怀疑我是否在寻找正确的东西。

这是由 Qt 的变化引起的吗?还是 PyQt4?还是python-SIP?

此外,我实际上并不了解 Qt 中的底层(C++)调用是什么。它实际上是在调用 QBrush() 和 QColor() 还是试图将 Python None 更改为 c null?

谢谢,我希望我没有错过一些明显的在线内容。

4

1 回答 1

1

PyQt-4.11.4ChangeLog有这个条目:

2015-02-06 菲尔·汤普森

  • PyQt4.msp:修复了所有采用 QVariant 参数的伪向量。[5c941d8fb16b] <4.11-维护>

这是sip/QtGui/qcolor.sip差异的相关部分:

--- PyQt-x11-gpl-4.11.3/sip/QtGui/qcolor.sip    2014-11-09
+++ PyQt-x11-gpl-4.11.4/sip/QtGui/qcolor.sip    2015-06-11
@@ -75,13 +70,17 @@

     QColor(Qt::GlobalColor color /Constrained/);
     QColor(QRgb rgb);
-    QColor(const QVariant &variant) /NoDerived/;
+    QColor(const QVariant &variant /GetWrapper/) /NoDerived/;
 %MethodCode
         #if QT_VERSION >= 0x050000
-        sipCpp = new QColor(a0->value<QColor>());
+        if (a0->canConvert<QColor>())
+            sipCpp = new QColor(a0->value<QColor>());
         #else
-        sipCpp = new QColor(qVariantValue<QColor>(*a0));
+        if (qVariantCanConvert<QColor>(*a0))
+            sipCpp = new QColor(qVariantValue<QColor>(*a0));
         #endif
+        else
+            sipError = sipBadCallableArg(0, a0Wrapper);
 %End

     QString name() const;

因此,似乎复制构造函数现在检查是否QVariant可以将参数转换为 a QColor/QBrush,如果不能,则会引发错误。

于 2015-10-07T16:08:10.133 回答