为了测试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();
}
main.qml
import QtQuick 2.2
import QtQuick.Controls 1.2
ApplicationWindow {
    id: mainWindow
    title: "Test window"
    width: 800
    height: 600
    visible: true
}
为了确保系统中没有安装任何开发库,我设置了一个纯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");
理想情况下,我只需要在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;
}
但我的线看起来很难看.边缘粗糙,看起来像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
工作流程非常简单 - 我使用编译源代码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" …我在我的应用程序中使用 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 }
    }
}
如何设置TextFields 的宽度?他们中的大多数必须适合右列中的所有空间。
现在的样子:

我有一个 main.qml,它使用加载器加载 Page1.qml。如何从我的 cpp 代码中找到 Page1.qml 中的对象“whiteArea”?
我目前正在使用以下内容来获取对象,并且希望也像这样获取加载的 qml。
QObject * object = engine.rootObjects().at(0)->findChild<QObject *>  ("yourObjectName");
主.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 …Drone我已经在我的远程主机上设置了Ubuntu 18.04 Linux。为了方便起见,我安装了drone-runner-exec. 我已经成功地将它连接到我的GitHub等。所以现在它工作正常,即它克隆存储库并开始运行我的管道。步骤之一是简单的 bash 脚本,它必须更新存储库中的子文件夹。
steps:
- name: Getting subfolders
  commands:
  - ./my_script
运行程序执行脚本,但在某些点上失败。搜索后,我发现在用户下执行的脚本我已经安装了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?" …在我的应用程序中,我有一个注册为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();
  }
}
在这里我将该类的实例注册为singleton:
qmlRegisterSingletonType<Config>("myNS", 1, 0, "Config", config_singletontype_provider);
在QML文件的某个地方,我尝试将javascript数组传递回c ++;
function sendValue() {
  var arr = [];
  arr["key"] = "value";
  Config.sendValue(arr);      
}
但没有通过.将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