Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QUiLoader与PySide中的自定义小部件一起崩溃_Python_Qt_Qt Creator_Pyside_Pyqtgraph - Fatal编程技术网

Python QUiLoader与PySide中的自定义小部件一起崩溃

Python QUiLoader与PySide中的自定义小部件一起崩溃,python,qt,qt-creator,pyside,pyqtgraph,Python,Qt,Qt Creator,Pyside,Pyqtgraph,我正在尝试将PySide PyQtGraph小部件嵌入到使用QT Creator创建的GraphicsView窗口中。但是,当我导入UI文件并使用QT Creator中的“升级到”功能时,会发生分段错误 之前已观察到此错误,并提出了覆盖QUiLoader的createWidget()的解决方案: 和 然而,当我实现该解决方案时,我仍然会出现分段错误 有人知道为什么这个变通方法在我的代码中不起作用吗?或者,在动态导入UI文件时,是否有其他方法嵌入PyQtGraph 非常感谢, 玉米卷 一些示例

我正在尝试将PySide PyQtGraph小部件嵌入到使用QT Creator创建的GraphicsView窗口中。但是,当我导入UI文件并使用QT Creator中的“升级到”功能时,会发生分段错误

之前已观察到此错误,并提出了覆盖QUiLoader的createWidget()的解决方案:



然而,当我实现该解决方案时,我仍然会出现分段错误

有人知道为什么这个变通方法在我的代码中不起作用吗?或者,在动态导入UI文件时,是否有其他方法嵌入PyQtGraph

非常感谢,

玉米卷

一些示例代码:

#!/usr/bin/python
import os
import sys

from PySide.QtUiTools import QUiLoader


import pyqtgraph as pg

SCRIPT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))

class UiLoader(QUiLoader):
    def __init__(self, baseinstance):
        QUiLoader.__init__(self, baseinstance)
        self.baseinstance = baseinstance

    def createWidget(self, className, parent = None, name = ""):
        if className in QUiLoader.availableWidgets(self):
            widget = QUiLoader.createWidget(self, className, parent, name)
        else:
            if hasattr(self.baseinstance, "customWidgets"):
                if className in self.baseinstance.customWidgets.keys():
                    widget = self.baseinstance.customWidgets[className](parent)
                else:
                    raise KeyError("Unknown widget '%s'" % className)
            else:
                raise AttributeError("Trying to load custom widget '%s', but base instance '%s' does not specify custom widgets." % (className, repr(self.baseinstance)))

        if self.baseinstance is not None:
            setattr(self.baseinstance, name, widget)

        return widget


def loadUi(uifile, baseinstance=None):
    loader = UiLoader(baseinstance)
    loader.registerCustomWidget(pg.PlotWidget)
    widget = loader.load(uifile)
    QMetaObject.connectSlotsByName(widget)
    return widget

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.ui = loadUi(os.path.join(SCRIPT_DIRECTORY, 'example1.ui'), self)
        self.ui.plotBtn.clicked.connect(self.PlotTest)

    def PlotTest(self):
        self.ui.plottest.plot(np.random.normal(size=50), clear=True)

def main():
    app = QApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()
和UI文件:example1.UI

<?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="PlotWidget" name="centralwidget">
   <widget class="QGraphicsView" name="graphicsView">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>30</y>
      <width>761</width>
      <height>471</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="plotBtn">
    <property name="geometry">
     <rect>
      <x>670</x>
      <y>510</y>
      <width>114</width>
      <height>32</height>
     </rect>
    </property>
    <property name="text">
     <string>Plot</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>22</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>

主窗口
0
0
800
600
主窗口
20
30
761
471
670
510
114
32
情节
0
0
800
22
PlotWidget
QWidget
pyqtgraph
1.

您可以通过使用
pg.Qt.loadUiType('uicfile.ui')
来规避QtUiLoader的PySides问题。以下是基于您的代码的示例:

from PySide.QtGui import *
import pyqtgraph as pg
import numpy as np

formClass, baseClass = pg.Qt.loadUiType('example1.ui')
class MainWindow(baseClass):
    def __init__(self, parent=None):
        baseClass.__init__(self, parent)
        self.ui = formClass()
        self.ui.setupUi(self)
        self.setCentralWidget(self.ui.centralwidget)
        self.ui.plotBtn.clicked.connect(self.PlotTest)

    def PlotTest(self):
        self.ui.centralwidget.plot(np.random.normal(size=50), clear=True)

def main():
    app = QApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

if __name__ == '__main__':
    main()
注:

  • 您的.ui文件似乎构建不正确--您将“centralwidget”升级为PlotWidget,而我认为您希望升级GraphicsView

  • 我在
    loadUiType
    中遇到了一些unicode问题,不得不使用最新的pyqtgraph开发版本。你可能也需要这样做


感谢您的帮助!正如您提到的,我还必须安装PyQtGraph的开发版本来解决loadUiType的问题。此外,我对Anaconda for mac附带的PySide软件包有一个问题。这个包中似乎没有包含pyside uic,但是在普通的python安装中,一切都像一个魔咒一样工作!!