pyqtgraph文档示例不适用于PySide

时间:2015-08-17 15:31:28

标签: python qt pyqtgraph

我开始使用pyqtgraph。我尝试运行下面的示例代码,但它给出了一个错误。此示例代码来自文档中的this page。我做的唯一改变是从PySide导入QtGui而不是PyQt4,评论明确说这应该有效。

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

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

我对错误的了解

  • 如果我从PyQt4
  • 导入QtGui,该示例将完美运行
  • 投诉似乎是我正在尝试使用其addWidget方法将PlotWidget添加到QGridLayout,但只允许使用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_()

2 个答案:

答案 0 :(得分: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的中间件加载器,然后将所有标头更改为使用中性的。

答案 1 :(得分:0)

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

显然你需要

  

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

像这样:

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

这解决了我的问题。