简体   繁体   English

将 Vispy SceneCanvas 嵌入 PyQt5 时,绘图出现在错误位置

[英]The plot appears at wrong position when embedding Vispy SceneCanvas into PyQt5

I am trying to write a subclass of vispy.scene.SceneCanvas and use it as a plot widget in my PyQt5 application.我正在尝试编写 vispy.scene.SceneCanvas 的子类,并将其用作 PyQt5 应用程序中的绘图小部件。 However, the plot always appears at wrong position (top-right corner), and I did not get any hint from vispy docs about this problem.然而,情节总是出现在错误的位置(右上角),我没有从 vispy 文档中得到关于这个问题的任何提示。

Actual Position实际位置

Expected Position预期位置

code:代码:

import vispy.scene as scene
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys 

class CustomPlot(scene.SceneCanvas):

    def __init__(self, **kwargs):

        super().__init__(**kwargs)

        self.unfreeze()
        self.grid = self.central_widget.add_grid(spacing=0)
        self.vb = self.grid.add_view(row=0, col=1, camera='panzoom')

        self.x_axis = scene.AxisWidget(orientation='bottom')
        self.x_axis.stretch = (1, 0.1)
        self.grid.add_widget(self.x_axis, row=1, col=1)
        self.x_axis.link_view(self.vb)

        self.y_axis = scene.AxisWidget(orientation='left')
        self.y_axis.stretch = (1, 0.1)
        self.grid.add_widget(self.y_axis, row=0, col=0)
        self.y_axis.link_view(self.vb)

        pos = np.array([[0, 0], [1, 1], [2, 0]])
        line = scene.Line(pos, 'red', parent=self.vb.scene)


if __name__ == "__main__":

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    app = QApplication([])
    win = QMainWindow()
    win.setCentralWidget(CustomPlot().native)
    win.show()

    if (sys.flags.interactive != 1) or not hasattr(Qt.QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()

I compared your code to what was in the plotting API and was able to get it to work using height_max and width_max instead of stretch .我将您的代码与绘图 API 中的代码进行了比较,并能够使用height_maxwidth_max而不是stretch来使其工作。 See https://github.com/vispy/vispy/blob/efa49b6896321374149998e15f8bce2ae327ba70/vispy/plot/plotwidget.py#L116-L131https://github.com/vispy/vispy/blob/efa49b6896321374149998e15f8bce2ae327ba70/vispy/plot/plotwidget.py#L116-L131

Here is what the code looks like for me now:这是我现在的代码:

import vispy.scene as scene
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys 

class CustomPlot(scene.SceneCanvas):

    def __init__(self, **kwargs):

        super().__init__(**kwargs)

        self.unfreeze()
        self.grid = self.central_widget.add_grid(spacing=0)
        self.vb = self.grid.add_view(row=0, col=1, camera='panzoom')

        self.x_axis = scene.AxisWidget(orientation='bottom')
        self.grid.add_widget(self.x_axis, row=1, col=1)
        self.x_axis.height_max = 40
        self.x_axis.link_view(self.vb)

        self.y_axis = scene.AxisWidget(orientation='left')
        self.y_axis.width_max = 40
        self.grid.add_widget(self.y_axis, row=0, col=0)
        self.y_axis.link_view(self.vb)

        pos = np.array([[0, 0], [1, 1], [2, 0]])
        line = scene.Line(pos, 'red', parent=self.vb.scene)


if __name__ == "__main__":

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    app = QApplication([])
    win = QMainWindow()
    win.setCentralWidget(CustomPlot().native)
    win.show()

    if (sys.flags.interactive != 1) or not hasattr(Qt.QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()

The output ends up looking like:输出最终看起来像:

在此处输入图片说明

The problem is solved after I realize I made a noob mistake, the y-axis stretch should be set as (0.1, 1) instead of (1, 0.1), although it is interesting that it appears correctly if I don't use the canvas as a PyQt widget.在我意识到我犯了一个菜鸟错误后问题就解决了,y 轴拉伸应该设置为 (0.1, 1) 而不是 (1, 0.1),尽管有趣的是如果我不使用它会正确显示画布作为 PyQt 小部件。 @djhoese 's solution also works well. @djhoese 的解决方案也很有效。

import vispy.scene as scene
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys 

class CustomPlot(scene.SceneCanvas):

    def __init__(self, **kwargs):

        super().__init__(**kwargs)

        self.unfreeze()
        self.grid = self.central_widget.add_grid(spacing=0)
        self.vb = self.grid.add_view(row=0, col=1, camera='panzoom')

        self.x_axis = scene.AxisWidget(orientation='bottom')
        self.x_axis.stretch = (1, 0.1)
        self.grid.add_widget(self.x_axis, row=1, col=1)
        self.x_axis.link_view(self.vb)

        self.y_axis = scene.AxisWidget(orientation='left')
        self.y_axis.stretch = (0.1, 1)
        self.grid.add_widget(self.y_axis, row=0, col=0)
        self.y_axis.link_view(self.vb)

        pos = np.array([[0, 0], [1, 1], [2, 0]])
        line = scene.Line(pos, 'red', parent=self.vb.scene)


if __name__ == "__main__":

    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    app = QApplication([])
    win = QMainWindow()
    win.setCentralWidget(CustomPlot().native)
    win.show()

    if (sys.flags.interactive != 1) or not hasattr(Qt.QtCore, 'PYQT_VERSION'):
        QApplication.instance().exec_()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM