qml 不适用于 vispy
qml doesn't work with vispy
在学习Qt和Qt的过程中,Quick遇到了一个很有意思的问题。我想在我的应用程序中添加一个小部件,可以使用 OpenGl 在其上呈现某些内容。我找到了一个使用 vispy 的小例子,并决定尝试一下。然后发生了一些非常有趣的事情。事实上,我的一个小部件是用 QML 编写的,当我启动我的应用程序时,带有 OpenGL 的小部件可以正常工作。出现一个黑色方块而不是 QML 小部件。同样在日志中写入以下内容:
WARNING: QQuickWidget cannot be used as a native child widget.
Consider setting 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)
分开一切正常,一起出现这个错误。我想知道这是什么问题?
您必须将属性与 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_())
在学习Qt和Qt的过程中,Quick遇到了一个很有意思的问题。我想在我的应用程序中添加一个小部件,可以使用 OpenGl 在其上呈现某些内容。我找到了一个使用 vispy 的小例子,并决定尝试一下。然后发生了一些非常有趣的事情。事实上,我的一个小部件是用 QML 编写的,当我启动我的应用程序时,带有 OpenGL 的小部件可以正常工作。出现一个黑色方块而不是 QML 小部件。同样在日志中写入以下内容:
WARNING: QQuickWidget cannot be used as a native child widget. Consider setting 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)
分开一切正常,一起出现这个错误。我想知道这是什么问题?
您必须将属性与 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_())