我使用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视图插入本机OSX窗口时遇到问题.我知道这是可能的,但我不知道我做错了什么.
基本上,我的目标是,给定一个原生的NSView*然后嵌入一个基于QML的小部件.问题是,我确定它确实在视图中渲染了qml,但是它创建了一个额外的透明窗口,它似乎没有正确地重绘QML视图.
这是我正在使用的代码(请忽略所有内存泄漏):
@interface AppDelegate ()
-(void)processEvents;
@property(nonatomic) NSTimer* timer;
@property(nonatomic) QApplication* qt;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
NSWindow* window = [[[NSApplication sharedApplication] windows] objectAtIndex:0];
NSView *view = [window contentView];
assert(view);
char* test[0];
int count = 0;
QApplication::instance()->setAttribute(Qt::AA_MacPluginApplication);
_qt = new QApplication(count, test);
QMacNativeWidget* native = new QMacNativeWidget(view);
assert(native);
QQuickWidget* qml = new QQuickWidget(native);
qml->setSource(QUrl(QStringLiteral("main.qml")));
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(qml);
native->setLayout(layout);
qml->show();
native->show();
NSView* qmlView = (NSView*)native->winId();
[view addSubview:qmlView]; …Run Code Online (Sandbox Code Playgroud) 我要求我的项目Window在一个屏幕上显示两个QML (一个发送者,一个接收者).两者都.qml要求我在里面包含一些Cpp模型,因此我QQmlApplicationEngine用来注册Cpp模型.
我发现使用QWidget::createWindowContainer()我能够Window为一个项目显示多个s.这适用于第一个QML文件.代码片段如下所示:
QQmlApplicationEngine* engine = new QQmlApplicationEngine(Qurl("main.qml"));
QmlContext* context = engine.getContextProperty();
//do some Cpp models registering...
QQuickview *view = new QQuickview(engine,0);
QWidget* container = widget::createWindowContainer(view);
//I realized I dont need to do container->show(); for the main.qml to appear..
//use desktop widget to move the 2nd container to the 2nd screen...
Run Code Online (Sandbox Code Playgroud)
我决定receive.qml用类似的方法为我创建第二个应用程序引擎.我很快意识到,receive.qml即使有了,也永远不会打开container2->show().现在,它显示一个空页面.
我的问题是:
使用g ++ -fsanitize = address进行编译时,出现了new-delete-type-mismatch。此代码是否错误?还是这是Qt错误?
我在一个大型应用程序中找到了它,并将其分解为以下代码。我想用QQuickView从C ++显示一个QML项目。但是QQuickView的Destructor中似乎有一个问题。
test.pro:
TEMPLATE = app
TARGET = test
QT += core gui widgets quick
SOURCES += test.cpp
QMAKE_CXXFLAGS += -fsanitize=address
QMAKE_LFLAGS += -fsanitize=address
Run Code Online (Sandbox Code Playgroud)
test.cpp:
#include <QApplication>
#include <QQuickView>
#include <QQuickItem>
int main( int argc, char *argv[] ) {
QApplication app ( argc, argv );
QQuickView view;
view.setSource(QUrl::fromLocalFile("test.qml"));
view.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
test.qml:
import QtQuick 2.4
Item {
id: item1
anchors.fill: parent
Rectangle {
id: rectangle
color: "#fba4e3"
anchors.fill: parent
}
}
Run Code Online (Sandbox Code Playgroud)
编译:
$ qmake-qt5 …Run Code Online (Sandbox Code Playgroud) 目前,我正在开发一个需要集成到 C++ Visual Studio 项目中的 Qt 类。
Qt 项目 - Qt Widgets 应用程序。在 Qt Creator 3.2.1(开源)上构建,基于 Qt 5.3.2。使用 Visual Studio 2013 Professional 安装 Qt Addin。
我尝试了互联网上或其他 Stack 帖子中的解决方案,但没有成功。我不认为我的帖子重复,因为其他帖子没有解决我的问题。
我能够从代码运行 QML,但它在不同的窗口上启动。在第一张图片中,QML 窗口(Qt 画布)显示在我的程序 UI 上。

我需要将 QML 集成到我的程序 UI 中。如果有帮助的话我可以使用QGraphicsView。

简单的 QML 示例。canvas.qml
import QtQuick 2.0
Rectangle {
id: rectangle
color: "red"
width: 600
height: 600
}
Run Code Online (Sandbox Code Playgroud) 我们正在使用 Qt/Qml 开发应用程序(Qml 嵌入在 QWidget 中)。删除包含 QQuickView(嵌入式)的 QWidget 时,分配的内存不会完全释放。
通过向应用程序添加 QWidget,将分配大约 30MB 的内存,但是当小部件删除时,只会释放大约 20MB 的内存。
在QWidget的析构函数中,我已经删除了QQuickView实例,没有其他大对象。
另外,我很确定 QQuickView 没有正确释放内存。
如何释放 QQuickView 分配的整个内存?
注意:代码真的很大(160000 行),所以我不能放示例代码。
提前致谢...
qml ×6
qquickview ×6
qt ×6
qtquick2 ×3
c++ ×2
cocoa ×1
memory-leaks ×1
qquickwidget ×1
qwidget ×1