我使用QQmlApplicationEngine
如下:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();
Run Code Online (Sandbox Code Playgroud)
但现在我想为我的应用程序启用多重采样,并且QQmlApplicationEngine
似乎没有setFormat
启用多重采样的方法.
我QQmlApplicationEngine
在论坛中找到了一种方法:
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
Run Code Online (Sandbox Code Playgroud)
但它依赖于引擎的第一个根对象是a QQuickWindow
,这在Qt docs中没有记录.所以我不想使用那种技术.
另一种方法是跳过QQmlApplicationEngine
并创建一个QQuickView
代替.这确实有一个setFormat
让我能多采样方法,但我不知道,我是不可能输给由切换什么QQmlApplicationEngine
来QQuickView
?
换句话说,这两个类之间有什么区别?
我找到的一个区别是(从这里):
与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口.如果您使用Qt Quick中的可视项目,则需要将它们放在窗口内.
这种特殊的差异对我来说无关紧要.
还有其他差异吗?
我发现这个老帖子面临同样的问题:如何模拟QML组件
不幸的是,没有解决方案.回顾一下问题:我有一个导入模块的QMLTestCase
.但是这个模块依赖于一个根上下文属性,它通常会被添加到main.cpp
.由于这是一个TestCase
,我对如何QQmlApplicationEngine
启动没有影响.
如何添加缺少的上下文属性?
我想将activated
来自QML 的信号从我的Python3/PyQt5(5.6)代码连接ListView
到一个pyqtSlot
装饰方法.
我目前的方法是在我的代码中加载QML场景QQmlApplicationEngine
,然后findChild()
用来获取对我的引用ListView
.
问题是,我只能在搜索QObject时找到ListView findChild(QObject, 'myList')
.但是htis对象并没有让我访问activated
信号,很可能是因为这个信号只为QAbstractItemView
它和它的后代定义.
所以,如果我尝试findChild(QListView, 'myList')
结果是None
.因此我无法activated
接收信号.这是PyQt5中的错误还是我有另一种方式连接到这个信号?
这是一些最小的工作示例.
list.py:
import sys
from OpenGL import GL
from PyQt5.QtCore import QUrl, QObject
from PyQt5.QtWidgets import QApplication, QListView
from PyQt5.QtQml import QQmlApplicationEngine
# Main Function
if __name__ == '__main__':
# Create main app
app = QApplication(sys.argv)
# Create QML engine
engine = QQmlApplicationEngine(app)
# Load the …
Run Code Online (Sandbox Code Playgroud) 我已将 MyItem.qml 作为源组件加载到 Loader 元素上。现在我想从 Loader 元素中删除或卸载该页面。我试图设置 source : "" & sourceComponent : "" ,还有 sourceComponent : "undefined"。但它没有用
我尝试注册一个类型,但出现此错误:
QQmlApplicationEngine 加载组件失败 qrc:/main.qml:5 模块“Komut”未安装
这是我正在使用的代码:
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
qmlRegisterType<Execom>("Komut",1,0,"Execom");
Run Code Online (Sandbox Code Playgroud) 我有一个基于QML的应用程序,main.qml
从文件系统加载文件,如下所示:
myEngine->load("main.qml");
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想"重新加载"引擎,以防main.qml被更新版本替换.
我到目前为止所尝试的是load()
再次调用,假设引擎会像其他Qt类一样自动重置.
不幸的是,这种情况并非如此.如果我再次调用该方法,将出现另一个窗口,其中包含更新的qml文件的内容,而原始窗口保持打开状态并继续显示旧的qml文件.
为了解决这个问题,我尝试调用load(QUrl())
,然后clearComponentCache()
对新文件进行最终加载调用.这导致相同的效果.
任何想法如何在应用程序运行时"正确"重新加载QML引擎?
我有一个名为“Cell.qml”的自定义 QML 项目,我想将其动态插入到我的根窗口中并使其可见。我也尝试更改 z 属性,但我无法修复它,该对象仍然不可见(即使 root->dumpObjectTree() 的输出也表明该对象作为根窗口的子窗口存在)
这是执行代码后的结果
主程序
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *root = engine.rootObjects()[0];
QQmlComponent component(&engine, "qrc:/Cell.qml");
if (component.isReady()){
QObject *object = component.create();
object->setParent(root);
engine.setObjectOwnership(object, engine.CppOwnership);
}
root->dumpObjectTree();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
主文件
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
}
Run Code Online (Sandbox Code Playgroud)
细胞.qml
import QtQuick 2.0
import QtQuick.Controls 2.3
Item{
property string txt: "" …
Run Code Online (Sandbox Code Playgroud) qml ×7
qt ×6
c++ ×2
qtquick2 ×2
listview ×1
pyqt5 ×1
python-3.x ×1
qquickview ×1
unit-testing ×1