python - 将 vispy 与 pyqt5 和 uic 集成

标签 python pyqt pyqt5 vispy

有关 vispy 的一些问题提到在添加小部件时使用 canvas.native。在qt设计器中作为占位符制作的小部件如何用于vispy?

这个想法就是由此而来

canvas = vispy.app.Canvas()
w = QMainWindow()
widget = QWidget()
w.setCentralWidget(widget)
widget.setLayout(QVBoxLayout())
widget.layout().addWidget(canvas.native)
widget.layout().addWidget(QPushButton())
w.show()
vispy.app.run()

到一个版本,其中有一个 ui 或生成的 python 文件,其中有一个名为“frameFor3d”的框架。

class myWindow(QtWidgets.QMainWindow):
    def __init__(self):

        super(myWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        #declare this here?
        canvas = vispy.app.Canvas()
        self.ui.frameFor3d.layout().addWidget(canvas.native)

if __name__ == '__main__': 
    app = QtWidgets.QApplication([])
    application = myWindow()
    vispy.app.run() #does it go here?
    application.show()
    sys.exit(app.exec())

此错误为“无”,因为布局() 为“无”。

uic样本

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'myWindow.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(440, 299)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.frameFor3d = QtWidgets.QFrame(self.centralwidget)
        self.frameFor3d.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frameFor3d.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frameFor3d.setObjectName("frameFor3d")
        self.gridLayout.addWidget(self.frameFor3d, 0, 0, 1, 1)
        self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.gridLayout.addWidget(self.horizontalSlider, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 440, 18))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

最佳答案

QFrame没有布局,所以必须设置布局,而run()方法是内部调用app.exec()的拦截器,所以没必要再次调用。

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

        canvas = vispy.app.Canvas()
        lay = QtWidgets.QVBoxLayout(self.ui.frameFor3d) # create layout
        lay.addWidget(canvas.native)

if __name__ == '__main__': 
    app = QtWidgets.QApplication([])
    application = myWindow()
    application.show()
    vispy.app.run()
    # sys.exit(app.exec())

关于python - 将 vispy 与 pyqt5 和 uic 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477679/

相关文章:

python - 两个 Pandas 数据框的联合

python - ipython 笔记本服务器设置调试

python - 当索引为复合时,pandas 多列应用失败

python - 为什么 PyQt 的 pyuic 会忽略默认边距?

python - 如何在发送 HTTP 204 之前刷新 Flask 中的 header ?

python - 如何修复我的 pyqt 程序中的错误(未绑定(bind)方法的第一个参数必须具有类型 'QDialog' )?

python - Pyqt5 deleteLater() VS sip.delete()

python - PyQt5 在每个选项卡旁边添加添加和删除小部件按钮

python - PyQt5 中缺少 menuBar

python - 如何在 PyQt5 窗口中嵌入 pptk 查看器