如何在PyQt4中访问QGIS-2.14的QString

时间:2018-07-28 02:30:00

标签: python pyqt4 python-import qgis qstring

这是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 > 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'

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

有什么方法可以使我的QgsRasterCalculator()通话正常工作?感谢您提供任何信息!

/ ================== 编辑:我的QGIS对建议的回复的屏幕截图 ========= = enter image description here / ================== 版本信息:

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')

1 个答案:

答案 0 :(得分:0)

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


关于authid()的潜在问题:

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

QString

如果正确导入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') 软件包绝对没有意义。它只是一个空的名称空间(出于性能原因)延迟导入其他模块。因此,您必须始终像上面一样,显式导入Qt模块。

PS:

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

PyQt4

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