【问题标题】:How to access QString for QGIS-2.14 in PyQt4如何在 PyQt4 中访问 QGIS-2.14 的 QString
【发布时间】:2019-01-05 03:27:57
【问题描述】:

这有点特定于 QGIS,但我认为这是一种低级别,所以我在这里发布了。如果更好的话,我绝对可以将其移至 gis.stackexchange.com。

尝试使用QgsRasterCalculator,它似乎需要一个 QString 类型的对象来处理几个参数。我尝试创建一个 QString (like described here) 但得到:

import PyQt4
PyQt4.QtCore.QString('foo')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'QString'

所以我尝试使用常规字符串作为我的第一个参数 (calc = QgsRasterCalculator( 'demffac &gt; 120', newStreams, 'GTiff', rFac.extent(), rFac.crs().authid(), rFac.height(), rFac.width(), entries)),我得到了:

Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: arguments did not match any overloaded call: QgsRasterCalculator(QString, QString, QString, QgsRectangle, int, int, list-of-QgsRasterCalculatorEntry): argument 5 has unexpected type 'unicode' QgsRasterCalculator(QString, QString, QString, QgsRectangle, QgsCoordinateReferenceSystem, int, int, list-of-QgsRasterCalculatorEntry): argument 5 has unexpected type 'unicode' QgsRasterCalculator(QgsRasterCalculator): argument 1 has unexpected type 'str'

我正在使用 QGIS 2.14,它一直是documented as using QString(据我所知)。我尝试使用sip 包进行重置(per these instructions),但 QGIS 的 python 控制台似乎不想更改(ValueError: API 'QString' has already been set to version 2)。

有什么方法可以让我的QgsRasterCalculator() 通话有效吗?感谢您提供任何信息!

/==================编辑:我的 QGIS 对建议的响应的屏幕截图======== = /=================== 版本信息:

from PyQt4.QtCore import QT_VERSION_STR
from PyQt4.pyqtconfig import Configuration

print("Qt version:", QT_VERSION_STR)
('Qt version:', '4.8.5')
cfg = Configuration()
print("SIP version:", cfg.sip_version_str)
('SIP version:', '4.14.7')
print("PyQt version:", cfg.pyqt_version_str)
('PyQt version:', '4.10.2')

【问题讨论】:

  • 嗨@ekhumoro。抱歉延迟回复。不,您的回答不适用于我的 QGIS 2.14.6 配置(除了添加插件,我并没有真正搞乱默认设置或配置)。我将添加一个屏幕抓取以显示我所看到的内容。
  • QString 问题是一个红鲱鱼。真正的错误实际上是由 non-QStirng 参数之一引起的。请参阅我的更新答案。

标签: python pyqt4 python-import qgis qstring


【解决方案1】:

更仔细地查看回溯,似乎QgsRasterCalculator 不需要使用QString。您为前三个参数传递了 python 字符串这一事实证明了这一点,并且错误消息根本没有抱怨它们。相反,它抱怨 fifth 参数,该参数必须是 intQgsCoordinateReferenceSystem 对象,而您似乎传入 unicode 或 @987654328 @对象。为什么要传入rFac.crs().authid() 的返回值?当然,您应该传入rFac.crs(),而不是authid()(即documented as returning a string)。


关于QString的潜在问题:

当与 Python2 一起使用时,PyQt4 肯定有 QString 类 - 除非您采取明确的步骤来更改 by using the sip module。您问题开头的代码不是您实际运行的代码,因为它不会引发该特定错误:

Python 2.7.15 (default, Jun 27 2018, 13:05:28)
[GCC 8.1.1 20180531] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyQt4
>>> PyQt4.QtCore.QString('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'QtCore'

如果你正确导入QtCore模块,代码可以正常工作:

>>> from PyQt4 import QtCore
>>> QtCore.QString('foo')
PyQt4.QtCore.QString(u'foo')

请注意,单独导入 PyQt4 包是没有意义的。它只是一个空的命名空间(出于性能原因)懒惰地导入其他模块。因此,您必须始终像我上面所做的那样显式导入 Qt 模块。

PS:

在您问题的后半部分,PyQt API 似乎已经以某种方式更改为版本 2,这将关闭QString 的支持。要重新打开它,您需要执行以下操作:

import sip
sip.setapi('QString', 1)

但是,此步骤必须在导入任何其他 PyQt 模块之前完成。

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多