qml不适用于vispy

时间:2017-05-30 08:25:02

标签: python pyqt qml pyqt5 vispy

在研究Qt和Qt的过程中,Quick遇到了一个非常有趣的问题。我想在我的应用程序中添加一个小部件,在其上使用OpenGl呈现某些内容。我发现了一个使用vispy的小例子,并决定尝试一下。然后发生了一些非常有趣的事情。事实是我的一个小部件是用QML编写的,当我启动我的应用程序时,OpenGL的小部件工作。出现黑色方块而不是QML小部件。同样在日志中写入以下内容:

  

警告:QQuickWidget不能用作本机子窗口小部件。   考虑设置Qt :: AA_DontCreateNativeWidgetSiblings

这是我的代码:

import QtQuick 2.7
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0

Rectangle {
width: 200
height: 200
color: 'white'

Rectangle {
    id: lef_rec
    width: parent.width / 2
    height: parent.height
    color: "green"
}

Rectangle {
    width: parent.width / 2
    height: parent.height
    anchors.left: lef_rec.right
    color: "blue"
}
}

在Python中:

self.qml_wdg = QQuickWidget()
self.qml_wdg.setSource(QtCore.QUrl("main.qml"))     
canvas = Canvas(keys='interactive', vsync=False).native
layout = QtWidgets.QVBoxLayout()
layout.addWidget(canvas)
layout.addWidget(self.qml_wdg)        
self.centralwidget.setLayout(layout)

单独一切正常,一起出现此错误。我想知道这个问题是什么?

1 个答案:

答案 0 :(得分:0)

您必须将该属性设置为setAttribute()

{your QApplication}.setAttribute(QtCore.Qt.AA_DontCreateNativeWidgetSiblings)

完整代码:

import sys

from PyQt5 import QtWidgets, QtCore, QtQuickWidgets
from vispy.app import Canvas


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent=parent)
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        self.qml_wdg = QtQuickWidgets.QQuickWidget()
        self.qml_wdg.setSource(QtCore.QUrl("main.qml"))
        canvas = Canvas(keys='interactive', vsync=False).native
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(canvas)
        layout.addWidget(self.qml_wdg)
        self.centralwidget.setLayout(layout)


app = QtWidgets.QApplication(sys.argv)
app.setAttribute(QtCore.Qt.AA_DontCreateNativeWidgetSiblings)
w = MainWindow()
w.show()
sys.exit(app.exec_())

enter image description here