如何设置小部件以供 vispy 使用

How to set widget for vispy use

我知道有人以多种方式提出了这个问题,但我无法根据我的具体用例解决这个问题。我使用 QT designer (pyQT 5.15) 来创建布局,并希望使用 vispy 作为显示。阅读后似乎我必须设置一个小部件,但我仍然不清楚如何设置。这就是我所拥有的,我正在尝试通过计时器将颜色从黑色更改为白色的简单示例。没有错误,但也没有可视化。

这里是GUI.ui转换为Python调用GUI.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(702, 603)
        self.vispy_widget = QtWidgets.QWidget(Dialog)
        self.vispy_widget.setGeometry(QtCore.QRect(150, 20, 531, 531))
        self.vispy_widget.setObjectName("vispy_widget")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(580, 560, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.horizontalScrollBar = QtWidgets.QScrollBar(Dialog)
        self.horizontalScrollBar.setGeometry(QtCore.QRect(160, 560, 401, 20))
        self.horizontalScrollBar.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalScrollBar.setObjectName("horizontalScrollBar")
        self.horizontalSlider = QtWidgets.QSlider(Dialog)
        self.horizontalSlider.setGeometry(QtCore.QRect(20, 60, 111, 16))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.hist_widget = QtWidgets.QWidget(Dialog)
        self.hist_widget.setGeometry(QtCore.QRect(20, 90, 120, 80))
        self.hist_widget.setObjectName("hist_widget")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
```

这是应用部分:

    import sys
    from vispy import gloo, app
    from gui import Ui_Dialog
    from PyQt5 import QtWidgets
    app.use_app('pyqt5')

    class Canvas(app.Canvas):

        def __init__(self, *args, **kwargs):
            app.Canvas.__init__(self, *args, **kwargs)
            self._timer = app.Timer('auto', connect=self.on_timer, start=True)
            self.tick = 0

        def on_draw(self, event):
            gloo.clear(color=True)

        def on_timer(self, event):
            self.tick += 1 / 60.0
            c = abs(math.sin(self.tick))
            gloo.set_clear_color((c, c, c, 1))
            self.update()

    class myWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(myWindow, self).__init__()
            self.ui = Ui_Dialog()
            self.ui.setupUi(self)

            canvas = Canvas()
            self.ui.vispy_widget(canvas.native)


    if __name__ == "__main__":
        gui = QtWidgets.QApplication(sys.argv)
        Dialog = QtWidgets.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()
        app.run()
        #sys.exit(app.exec_())

存在以下错误:

  • self.ui.vispy_widget(canvas.native)命令没有意义,思路是用vispy_widget作为原生vispy widget的容器​​,可以通过layout放置

  • .ui形式的选择用于确定基数class,在你的情况下你应该使用QDialog而不是QMainWindow。

  • 如果您已经在小部件中设置了 Ui_Dialog,则无需在 if __name__ == "__main__": 中实现相同的设置。

  • 您必须导入 math 模块。

import math
import sys

from vispy import gloo, app

from PyQt5 import QtWidgets

from gui import Ui_Dialog

app.use_app("pyqt5")


class Canvas(app.Canvas):
    def __init__(self, *args, **kwargs):
        app.Canvas.__init__(self, *args, **kwargs)
        self._timer = app.Timer("auto", connect=self.on_timer, start=True)
        self.tick = 0

    def on_draw(self, event):
        gloo.clear(color=True)

    def on_timer(self, event):
        self.tick += 1 / 60.0
        c = abs(math.sin(self.tick))
        gloo.set_clear_color((c, c, c, 1))
        self.update()


class MyWindow(QtWidgets.QDialog):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.canvas = Canvas()

        lay = QtWidgets.QVBoxLayout(self.ui.vispy_widget)
        lay.addWidget(self.canvas.native)


if __name__ == "__main__":
    gui = QtWidgets.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    app.run()