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

问题描述 投票:1回答:1

这是一个特定的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'

我正在使用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对建议的回应========= 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')
python pyqt4 python-import qgis qstring
1个回答
0
投票

仔细观察回溯,似乎QgsRasterCalculator不需要使用QString。事实证明,您为前三个参数传递了python字符串,并且错误消息根本不会抱怨它们。相反,它抱怨第五个参数,它必须是intQgsCoordinateReferenceSystem对象,而你似乎传递unicodestr对象。你为什么要传递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模块之前执行此步骤。

© www.soinside.com 2019 - 2024. All rights reserved.