为了测试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应用程序以确保它可以在任何其他 - 非开发 - 机器上运行?
我的应用程序使用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.我现在尝试创建自定义的QML元素QQuickItem.所以我压倒了QQuickItem::updatePaintNode,现在想要画一条线.我的代码:
QSGNode *StrikeLine::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
{
QSGGeometryNode *node = 0;
QSGGeometry *geometry;
QSGFlatColorMaterial *material;
node = static_cast<QSGGeometryNode *>(oldNode);
if(!node) {
node = new QSGGeometryNode;
geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 2);
geometry->setDrawingMode(GL_LINES);
geometry->setLineWidth(3);
material = new QSGFlatColorMaterial;
material->setColor(QColor(255, 0, 0));
node->setGeometry(geometry);
node->setFlag(QSGNode::OwnsGeometry);
node->setMaterial(material);
node->setFlag(QSGNode::OwnsMaterial);
getColor();
} else {
geometry = node->geometry();
material = static_cast<QSGFlatColorMaterial *>(node->material());
}
geometry->vertexDataAsPoint2D()[0].set(p_startPoint.x(), p_startPoint.y());
geometry->vertexDataAsPoint2D()[1].set(p_endPoint.x(), p_endPoint.y());
material->setColor(getColor());
node->markDirty(QSGNode::DirtyGeometry);
return node;
}
Run Code Online (Sandbox Code Playgroud)
但我的线看起来很难看.边缘粗糙,看起来像DOS图形.所以我的问题 - 如何应用流畅的绘画?我现在可能是一些着色器或其他东西,但我找不到任何文档.
我有一个 Github 存储库,其中包含一些 Linux 实用程序。
为了运行测试,我使用 GitHub 操作和一些简单的自定义工作流程,这些工作流程使用自托管运行器在远程 Linux 服务器上运行:
name: CMake
on: [push]
env:
BUILD_TYPE: Release
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v2
- name: Build
working-directory: ${{runner.workspace}}/Utils
shell: bash
run: cmake --build . --config $BUILD_TYPE
- name: Run test
working-directory: ${{runner.workspace}}/Utils
shell: bash
run: ./testing/test.sh
Run Code Online (Sandbox Code Playgroud)
工作流程非常简单 - 我使用编译源代码cmake,然后运行来自同一存储库的脚本来测试构建。测试脚本是一个 bash 脚本,如下所示:
#!/bin/bash
export LD_LIBRARY_PATH=/path/to/bin
cd /path/to/bin
echo -e "Starting the tests"
./run_server &
./run_tests
if [ $? -eq 0 ]; then
echo "successful"
else
echo "failed" …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用 QML 作为 UI,现在我想构建一些表单。这是一个代码:
Window {
width: 400
height: 600
flags: Qt.Dialog
modality: Qt.ApplicationModal
GridLayout {
id: mainLayout
columns: 2
rowSpacing: 5
columnSpacing: 5
anchors {
top: parent.top;
left: parent.left
right: parent.right
}
Label { text: "field1" }
TextField { id: field1; }
Label { text: "field2"}
TextField { id: field2 }
}
}
Run Code Online (Sandbox Code Playgroud)
如何设置TextFields 的宽度?他们中的大多数必须适合右列中的所有空间。
现在的样子:

我有一个 main.qml,它使用加载器加载 Page1.qml。如何从我的 cpp 代码中找到 Page1.qml 中的对象“whiteArea”?
我目前正在使用以下内容来获取对象,并且希望也像这样获取加载的 qml。
QObject * object = engine.rootObjects().at(0)->findChild<QObject *> ("yourObjectName");
Run Code Online (Sandbox Code Playgroud)
主.qml
import QtQuick 2.3
import QtQuick.Controls 1.2
import myplugin 1.0
ApplicationWindow {
id:app
visible: true
width: 640
height: 480
title: qsTr(" World")
objectName: "Appwindow"
property ApplicationWindow appwindow:app
Label {
objectName: "label"
text: qsTr(" World")
anchors.centerIn: parent
}
MyItemTest{
objectName: "myItem"
anchors.fill: parent
}
Rectangle{
objectName: "Rectangle"
id:rect
width: 50
height: 50
color: "yellow"
}
Button {
objectName: "MyButton"
id: btnClick
text : "btn"
Loader …Run Code Online (Sandbox Code Playgroud) Drone我已经在我的远程主机上设置了Ubuntu 18.04 Linux。为了方便起见,我安装了drone-runner-exec. 我已经成功地将它连接到我的GitHub等。所以现在它工作正常,即它克隆存储库并开始运行我的管道。步骤之一是简单的 bash 脚本,它必须更新存储库中的子文件夹。
steps:
- name: Getting subfolders
commands:
- ./my_script
Run Code Online (Sandbox Code Playgroud)
运行程序执行脚本,但在某些点上失败。搜索后,我发现在用户下执行的脚本我已经安装了Drone. 我在ps aux输出中看到 和docker都drone在root.
所以我的问题 - 如何更改运行程序运行的系统用户?
我现在正在尝试将我的应用UI从C++转换为QML.在某些步骤我需要一个登录窗口,所以我用QML创建它,代码如下:
Window {
id: loginWindow
property string username: login.text;
property string password: password.text;
property bool issave: savePassword.checked;
flags: Qt.Dialog
modality: Qt.WindowModal
width: 400
height: 160
minimumHeight: 160
minimumWidth: 400
title: "Login to program"
GridLayout {
columns: 2
anchors.fill: parent
anchors.margins: 10
rowSpacing: 10
columnSpacing: 10
Label {
text: "Login"
}
TextField {
id: login
text: Config.getParam("user")
Layout.fillWidth: true
}
Label {
text: "Password"
}
TextField {
id: password
text: Config.getParam("password")
echoMode: TextInput.Password
Layout.fillWidth: true
}
Label {
text: "Save password?" …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个注册为singleton的类QML.我的目的是在QML关联数组中收集值并将此数组传递给C++.这是该类的简化版本:
class Config : public QObject
{
Q_OBJECT
private:
Config(QObject *parent = 0);
public:
static Config *instance();
~Config();
Q_INVOKABLE void sendValue (const QVariantMap &map) {
qWarning() << map.size();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我将该类的实例注册为singleton:
qmlRegisterSingletonType<Config>("myNS", 1, 0, "Config", config_singletontype_provider);
Run Code Online (Sandbox Code Playgroud)
在QML文件的某个地方,我尝试将javascript数组传递回c ++;
function sendValue() {
var arr = [];
arr["key"] = "value";
Config.sendValue(arr);
}
Run Code Online (Sandbox Code Playgroud)
但没有通过.将map.size()在C++返回0.也许我需要一些额外的转换?
我工作了很长时间,QGraphicsItem它有transform()功能.现在我不会做同样的事情,QQuickItem但不幸的是它错过了transform().所以我的问题 - 如何获得变换矩阵QQuickItem?
qml ×8
qt ×6
qtquick2 ×6
qt-quick ×3
c++ ×2
javascript ×2
arrays ×1
deployment ×1
docker ×1
drone.io ×1
github ×1
linux ×1
qt5 ×1
shader ×1
ubuntu-18.04 ×1