我正在使用QML,我想动态地向SplitView添加元素,例如.onMouseClick,但到目前为止我没有找到答案.
到目前为止我发现的是SplitView它的默认属性设置为它的第一个孩子的data属性.所以我想我应该尝试添加新动态创建的组件,并将父组设置为该child(splitView1.children[0]).不幸的是,这也不起作用.在组件加载完成后,第一个子节点的子节点数为零(看起来像SplitLayout的Component.onCompleted事件调用一个将这些子节点移动到其他地方的函数).因此,添加的子项不会呈现(并且不响应任何布局附加属性).
请参阅以下代码段:
import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0
ApplicationWindow {
width: 600
height: 400
SplitView {
anchors.fill: parent
Rectangle {
id: column
width: 200
Layout.minimumWidth: 100
Layout.maximumWidth: 300
color: "lightsteelblue"
}
SplitView {
id: splitView1
orientation: Qt.Vertical
Layout.fillWidth: true
Rectangle {
id: row1
height: 200
color: "lightblue"
Layout.minimumHeight: 1
}
// Rectangle { //I want to add Rectangle to splitView1 like this one, but dynamicly eg.onMouseClick
// color: "blue"
// …Run Code Online (Sandbox Code Playgroud) 我正在为QtQuick 2.0编写我的第一个QML/Javascript应用程序.我需要放置一个DatePicker控件,但是我没有在QtQuick.Controls下找到任何像这样的控件 - 实际上也没有.
我开始相信没有办法在QML中调用'native'DatePicker.我必须实现一个还是存在一个?
我想在QML中使用QAbstractListModel派生模型.将模型绑定到视图已经很有效.
我想要实现的下一件事是能够访问特定项目及其角色,就像使用QML ListModel一样
grid.model.get(index).DisplayRole
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何在我的QAbstractListModel派生模型中实现这个get方法.
任何提示?
为了测试QML部署,我创建了一个非常简单的QML应用程序.这是代码:
main.cpp中
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QFile>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QQmlApplicationEngine engine;
QString path = app.applicationDirPath() + "/qml/main.qml";
if(QFile::exists(path))
engine.load(path);
else {
return 1;
}
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
main.qml
import QtQuick 2.2
import QtQuick.Controls 1.2
ApplicationWindow {
id: mainWindow
title: "Test window"
width: 800
height: 600
visible: true
}
Run Code Online (Sandbox Code Playgroud)
为了确保系统中没有安装任何开发库,我设置了一个纯Windows XP安装的虚拟机.然后,我按照此处所述的说明将所有 Qt5*.dll 复制到程序目录中,以及platforms/qwindows.dll和icu*52.dll.Dependency Walker确认没有遗留任何破坏的依赖关系,即一切都应该已经正确设置.
但是,由于某些原因,当我运行我的应用程序时,我什么也看不见.既不是窗口,也不是错误消息.从控制台运行也没有错误.尽管如此,我可以看到我的应用程序在任务管理器中运行,就像它在后台运行一样.在开发机器上运行应用程序没有问题:应用程序正确启动,我可以看到它的窗口.
我究竟做错了什么?如何部署QML应用程序以确保它可以在任何其他 - 非开发 - 机器上运行?
我想使用原始OpenGL调用在QtQuick场景中绘制单个项目.我决定采取这个问题的建议方法.
我创建了一个Qt Quick项目,QQuickFramebufferObject并将其公开给QML Renderer:(代码基于Qt示例:场景图 - 渲染FBO)
class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
Run Code Online (Sandbox Code Playgroud)
源文件:
class LogoInFboRenderer : public QQuickFramebufferObject::Renderer {
public:
LogoInFboRenderer() { }
void render() {
int width = 1, height = 1;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0, 1.0, 0.0, 0.8);
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(width, 0);
glVertex2f(width, height);
glVertex2f(0, height);
glEnd();
glLineWidth(2.5);
glColor4f(0.0, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(width, height);
glVertex2f(width, 0);
glVertex2f(0, height);
glEnd();
update();
} …Run Code Online (Sandbox Code Playgroud) 根据我的理解,要在QML中将属性设为数组,您必须将其指定为类型variant或var:
property var myArray:[]
这看起来与以下内容完全相同:
property variant myArray:[]
这是真的?
我的应用程序使用c ++和QML.
我在C++部分定义了几个对象来访问SQL等.
看起来像:
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = 0);
Q_INVOKABLE void someFunction(const QString &query);
};
qmlRegisterType<MyObject>("xxx.xxx", 1, 0, "MyObject");
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只需要在JML中使用这些对象,而不是在QML中.
我尝试了很多例子并阅读了所有文档,但仍然无法解决我的问题.
所以我的问题:
var obj = Qt.createComponent("MyObject");但看起来不行.是否有可能以正常的JS风格定义新对象 - var obj = new MyObject;?TypeError: Property 'someFunction' of object QQmlComponent(0x3605f5c0) is not a function.我在这里做错了什么?我的对象派生自QObject,而不是来自QQmlComponent.我有一部分HTML代码,显示小表.在浏览器中,它看起来像在图片中:
但是,当我想在Text QML(根据文档,应该支持HTML)中显示它时,我看到:

(橙色矩形是矩形的一部分,是父的mytext)
Text {
id: mytext
anchors.fill: parent
text: "<div><table border='1'><caption><h4>Test stats</h4>"+
"</caption><tr bgcolor='#9acd32'><th/><th>Number1</th><th>Number2</th></tr> <tr><th>Line1</th>"+
"<td> 0 </td> <td> 1 </td> </tr> <tr><th>Line2</th> <td> 0 </td> <td> 1 </td> </tr>"+
"<tr><th>Line3</th> <td> 0 </td> <td> 0 </td> </tr> <tr><th>Line4</th> <td> 1 </td> <td> 0 </td> </tr>"+
"<tr><th>Line5</th> <td> 1 </td> <td> 1 </td> </tr> <tr><th>Line6</th> <td> 1 </td> <td> 1 </td> </tr> </div>"
}
Run Code Online (Sandbox Code Playgroud)
那么如何在QML(QtQuick 2.0)中正确显示这个HTML表格呢?是否可以不使用WebView?
我一直在尝试使用QML TableView来显示QAbstractTableModel.等式中缺少的部分似乎是不可能有一个可变数量的列TableView,尽管覆盖QAbstractItemModel::roleNames哪个应该告诉Qt我的列的数量和名称.我尝试仅使用QML进行测试:
import QtQuick 2.0
import QtQuick.Controls 1.1
Rectangle {
anchors.fill: parent
property real showImage: 1.0
width: 500
TableView {
id: myTable
model: myModel
// TableViewColumn {
// role: "title"; title: "Name"; width: 200
// }
}
ListModel {
id: myModel
ListElement {
title: "item one"
}
ListElement {
title: "item two"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,尽管TableView包含ListElement在其中定义了角色的s的模式,但这并未显示任何内容.
但是,如果上面的代码被取消注释并且TableViewColumn定义了a ,则该列将按预期显示该角色的数据,但该表仍将不显示任何其他角色.显然,这只适用于静态定义的列数,而不适用于直到运行时才知道列数的情况.
给出的示例与我的实际示例基本相同,只是我的模型是用C++定义的.
编辑:我曾尝试调用javascript函数:
function …Run Code Online (Sandbox Code Playgroud) qml ×10
qtquick2 ×10
qt ×8
qt-quick ×4
qt5 ×2
c++ ×1
datepicker ×1
deployment ×1
html ×1
javascript ×1
opengl ×1