【问题标题】:pyqtgraph documentation example doesn't work with PySidepyqtgraph 文档示例不适用于 PySide
【发布时间】:2015-11-10 07:36:57
【问题描述】:

我开始使用 pyqtgraph。我尝试运行下面的示例代码,但它给出了错误。此示例代码来自文档中的this page。我所做的唯一更改是从 PySide 导入 QtGui 而不是 PyQt4,cmets 明确表示应该可以。

问题 我该如何解决这个错误?我是否使用了错误的版本?这是 PySide 中的错误吗?

注意:我知道我可以使用 PyQt4 代替 PySide,但这对我来说不是一个有效的解决方法,原因有几个(许可和加入 PySide 潮流的愿望)。

我对错误的了解

  • 如果我从 PyQt4 导入 QtGui,该示例将完美运行
  • 抱怨似乎是我试图将 PlotWidget 添加到 QGridLayout,使用它的 addWidget 方法,但只允许 QWidget 对象。这是没有意义的,因为 AFAIK PlotWidget 是 QWidget 的后代。我猜这是底层 Qt 库包装的问题?
  • 使用:
    • Ubuntu 14.04
    • PySide 1.2.1
    • PySide.QtCore.qVersion 给出 '4.8.6'
    • PySide.QtCore.__version__ 也是 '4.8.6',这意味着 PySide 是使用我使用的相同 Qt 版本编译的。

要修复的错误

Traceback (most recent call last):
  File "<some file I made>", line 133, in <module>
    testPlot0()
  File "<some file I made>", line 52, in testPlot0
    layout.addWidget(plot, 0, 1, 3, 1)  # plot goes on right side, spanning 3 rows
TypeError: 'PySide.QtGui.QGridLayout.addWidget' called with wrong argument types:
  PySide.QtGui.QGridLayout.addWidget(PlotWidget, int, int, int, int)
Supported signatures:
  PySide.QtGui.QGridLayout.addWidget(PySide.QtGui.QWidget, int, int, PySide.QtCore.Qt.Alignment = 0)
  PySide.QtGui.QGridLayout.addWidget(PySide.QtGui.QWidget, int, int, int, int, PySide.QtCore.Qt.Alignment = 0)
  PySide.QtGui.QGridLayout.addWidget(PySide.QtGui.QWidget)

产生此错误的代码

from PySide import QtGui  # (the example applies equally well to PySide)
import pyqtgraph as pg

## Always start by initializing Qt (only once per application)
app = QtGui.QApplication([])

## Define a top-level widget to hold everything
w = QtGui.QWidget()

## Create some widgets to be placed inside
btn = QtGui.QPushButton('press me')
text = QtGui.QLineEdit('enter text')
listw = QtGui.QListWidget()
plot = pg.PlotWidget()

## Create a grid layout to manage the widgets size and position
layout = QtGui.QGridLayout()
w.setLayout(layout)

## Add widgets to the layout in their proper positions
layout.addWidget(btn, 0, 0)   # button goes in upper-left
layout.addWidget(text, 1, 0)   # text edit goes in middle-left
layout.addWidget(listw, 2, 0)  # list widget goes in bottom-left
layout.addWidget(plot, 0, 1, 3, 1)  # plot goes on right side, spanning 3 rows

## Display the widget as a new window
w.show()

## Start the Qt event loop
app.exec_()

【问题讨论】:

  • 我无法在 Windows 上使用 PySide v1.2.2 和 pyqtgraph 0.9.10 重现此问题。可能是 PySide v1.2.1 中的错误?我知道你有使用 PySide 的理由,但我发现它有烦人的 bug,而且似乎没有人再维护这个项目了。
  • 我开始明白你的意思了,尽管it seems 我们最近仍在进行一些维护。
  • 好的,现在有问题的代码对我来说非常有用。我彻底糊涂了。在回到这个问题之前,我确实从 ubuntu 14.04.02 升级到了 14.04.03。也许这与它有关......很奇怪。

标签: python qt pyqtgraph


【解决方案1】:

可能发生的事情是 pyqtgraph 不使用不可知的导入,而是使用特定的 PyQt 导入并正在创建类型小部件:

PyQt.QtGui.QWidget

而不是

PySide.QtGui.QWidget

您可能需要进入 pyqtgraph 的源代码并更改其导入以匹配您的。

同时支持 PySide 和 PyQt

在本页底部:

https://wiki.qt.io/Differences_Between_PySide_and_PyQt

它讨论了如何使您的代码对 pyside v pyqt 导入更加不可知...使用py_compat.py 或构建/安装名为python_qt_binding 的中间件加载器,然后将所有标题更改为使用中性的.

【讨论】:

  • 听起来很有希望。我会试一试并发布结果。
  • Pyqtgraph 确实做了不可知的导入。我认为问题出在其他地方(除非导入代码自我上次使用以来出现了错误......)
  • 看着那个页面,我想我同意three_pinapples:我不认为这是问题所在。此外,有问题的代码 sn-p 在升级我的 ubuntu 后神秘地开始工作。问题一定出在其他地方
【解决方案2】:

我遇到了同样的问题,偶然发现了 this link

显然你需要

如果您的系统上安装了这两个库,并且您希望强制 pyqtgraph 使用其中一个,只需确保在 pyqtgraph 之前导入它:

像这样:

import PySide  ## this will force pyqtgraph to use PySide instead of PyQt4
import pyqtgraph as pg

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2014-03-15
    • 2014-10-20
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多