首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PySide2在Qt-Designer中嵌入PyQtGraph

用PySide2在Qt-Designer中嵌入PyQtGraph
EN

Stack Overflow用户
提问于 2020-04-05 07:35:50
回答 1查看 671关注 0票数 3

我无法使用PySide2和.ui文件让PyQtGraph工作,因为我在Qt-Designer中将QWidget提升为PlotWidget。当我使用PyQt5时,它工作得很好,但是使用PySide2时,我得到了以下消息:

代码语言:javascript
复制
    Qt WebEngine seems to be initialized from a plugin. Please set Qt::AA_ShareOpenGLContexts using >QCoreApplication::setAttribute before constructing QGuiApplication.
    "QFormBuilder was unable to create a custom widget of the class 'PlotWidget'; defaulting to base class 'QWidget'."
    Traceback (most recent call last):
      File "test_widget3.py", line 13, in <module>
        window.graphWidget.plot([1,5,10], [1,2,7])
    AttributeError: 'PySide2.QtWidgets.QWidget' object has no attribute 'plot'

代码:

代码语言:javascript
复制
import sys
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtUiTools import QUiLoader
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg

app = QtWidgets.QApplication(sys.argv)
loader = QUiLoader()
window = loader.load("pyqtgraph_window.ui")
window.graphWidget.plot([1,5,10], [1,2,7])

window.show()
app.exec_()

使用PyQt5 (它可以工作):

代码语言:javascript
复制
import sys
from PyQt5 import QtWidgets, uic
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg

app = QtWidgets.QApplication(sys.argv)
window = uic.loadUi("pyqtgraph_window.ui")
window.graphWidget.plot([1,5,10], [1,2,7])

window.show()
app.exec_()

.ui:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="PlotWidget" name="graphWidget" native="true"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>PlotWidget</class>
   <extends>QWidget</extends>
   <header>pyqtgraph</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

我使用的是来自Github和PySide2 v5.12的PyQtGraph的最新开发版本,如果你能帮上忙,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 19:53:58

loadUi动态地使用名称访问类,这个概念在C++中不存在,所以QUiLoader有这个限制,所以解决方案是显式地指示转换覆盖createWidget方法:

代码语言:javascript
复制
import os
import sys

from PySide2 import QtCore, QtGui, QtWidgets, QtUiTools
import pyqtgraph as pg


CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class UiLoader(QtUiTools.QUiLoader):
    def createWidget(self, className, parent=None, name=""):
        if className == "PlotWidget":
            return pg.PlotWidget(parent=parent)
        return super().createWidget(className, parent, name)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    loader = UiLoader()
    window = loader.load(os.path.join(CURRENT_DIR, "pyqtgraph_window.ui"))
    window.graphWidget.plot([1, 5, 10], [1, 2, 7])
    window.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61036166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档