C++与QML混合编程

2023-05-16

一、前言

简单来说,混合编程就是通过Qml高效便捷的构建UI界面,而使用C ++来实现业务逻辑和复杂算法。Qt集成了QML引擎Qt元对象系统,使得QML很容易从C ++中得到扩展,在一定的条件下,QML就可以访问QObject派生类的成员,例如信号、槽函数、枚举类型、属性、成员函数等。

C++与QML交互时,一些基本类型C++与QML之间能自动转化,两者之间可以互通。如下:

除以上的数据类型外,C++传递给QML的值是无法被QML识别的,也就是自定义的数据类型是无法通过编译系统自动转化的,比如 Enum、QList、QMap、struct 结构体等复杂数据。因此只能采用发送信号携带参数或者使用 Q_INVOKABLE 宏在qml中获得返回值,将该自定义数据类型以QObject子类对象的形式传递给QML

二、基础数据类型实现方式

Qt中提供了两种在 QML 环境中使用C ++对象的方式

方式一: 在C ++中实现一个类,注册到Qml环境中,Qml环境中使用该类型创建对象

方式二: 在C ++中构造一个对象,将这个对象设置为Qml的上下文属性,在Qml环境中直接使用该属性

两种方式之间的区别是第一种可以使C ++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大。下面主要说明下方式一的实现步骤

第一步: 创建继承自QObject的C++类,对象必须继承自QObject才能在QML被使用和访问

第二步:在类定义中使用Q_PROPERTY导出成员的READ、WRITE、NOTIFY接口,这样类中的成员变量就可以在QML调用和修改了,同时变量被修改后也会发送信号通知QML端。用 Q_INVOKABLE 修饰成员函数,这样类中的成员函数就可以直接被QML调用。前提是该模块已经被注册过!!!

class MyObject : public QObject
{
    Q_OBJECT //必须有

public:
    explicit MyObject(QObject *parent = nullptr);
    ~MyObject();
    static MyObject * getInstance();

    //读取函数,对应READ
    int getIValue() {return iValue};
    QString getSStr() {return sStr};

    //被 Q_INVOKABLE 修饰C++函数能直接被QML调用
    Q_INVOKABLE void setCapture(bool state);

    //写函数,对应 WRITE,可以没有
    Q_INVOKABLE void setIValue(int value) {iValue = value};
    Q_INVOKABLE void setSStr(const QString &str) {sStr = value};

    //定义公有的槽函数
public slots:
    Q_INVOKABLE void cppSlot(int i, QString s);

private slots:
    void timer_timeout();

signals:
    //修改通知,对应 NOTIFY,可以没有。可以分开写,也可以用同一个信号
    void iValueChanged(int value);
    void sStrChanged(const QString &str);
    void myObjDataChanged();
    void cppSig(QVariant i, QVariant s);

private:
    QTimer *timer;
    int iValue;
    QString sStr;

    // property declarations required for QML
    Q_PROPERTY(int iValue READ getIValue WRITE setIValue NOTIFY myObjDataChanged)
    Q_PROPERTY(QString sStr READ getSStr WRITE setSStr NOTIFY myObjDataChanged)
};

第三步:在main.cpp中注册模块

//使用qmlRegisterType注册模块,在qml中通过 import 模块名称 进行引用
//模块名称、主版本号、次版本号、类名称
qmlRegisterType<MyObject>("MyObj11", 1, 0, "MyObject");

方式二实现方式

QQmlApplicationEngine engine;
//使用setContextProperty设置全局对象/上下文对象。作用域为全局
//常用于一些不变的常量
QQmlContext *context = engine.rootContext();
context->setContextProperty("SCREEN_WIDTH", 800);

第四步:QML端调用

import QtQml 2.12
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import MyObj11 1.0 //根据模块名称导入模块

//创建MyObject对象
MyObject{
    objectName: "myobj"
    //可直接操作MyObject类中的数据了
    id: myobj
    iValue: 10
    sStr: "www"
    Component.onCompleted:{
        console.log(iValue, sStr)
    }
}
//监控myobj.iValue的改变
onValueChanged: {
    console.log("onValueChanged: ", value)
}

//1、直接访问C++的成员变量和成员函数....................................
Button{
    id: btn1
    objectName: "button1"
    x:20; y:20
    anchors.margins: 10
    text: "访问C++成员和方法"
    onClicked: {
        myobj.iValue += 2 //修改myobj.iValue的值
        onoff = onoff ? 0 : 1
        myobj.setCapture(onoff) //调用C++端函数
    }
}

三、自定义数据类型实现方式

1、在QML中使用C++端的枚举类型

C++的枚举类型如果要在QML中使用,需要在使用 Q_ENUMS 去修饰这个枚举类型

.h头文件

#ifndef TIMINGSAMPPARA_H
#define TIMINGSAMPPARA_H

#include <QObject>

class TimingSampPara : public QObject
{
    Q_OBJECT
public:
    explicit TimingSampPara(QObject *parent = nullptr);
    ~TimingSampPara();

    //枚举
    enum E_TIMINGSAMP_PARA
    {
        E_TIMINGSAMP_PARA_NO = 0,
        E_TIMINGSAMP_PARA_ENABLE,
        E_TIMINGSAMP_PARA_TIME,
        E_TIMINGSAMP_PARA_ALL
    };
    Q_ENUMS(E_TIMINGSAMP_PARA)

    int getNo() const;
    int getEnable() const;
    QString getTime() const;

    void setNo(int value);
    void setEnable(int value);
    void setTime(QString value);

    Q_PROPERTY(int no READ getNo WRITE setNo)
    Q_PROPERTY(int enable READ getEnable WRITE setEnable)
    Q_PROPERTY(QString time READ getTime WRITE setTime)

private:
    int no;
    int enable;    //使能
    QString time;  //时间(月-日 时:分)
};

#endif // TIMINGSAMPPARA_H

main.cpp中注册自定义类型

qmlRegisterType<TimingSampPara>("MyTimingSampPara",1,0, "TimingSampPara");

.qml 端使用

import MyTimingSampPara 1.0

arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_NO] = 6
arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_ENABLE] = 201
arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_TIME] =  "00-00 05:02"

2、在QML中读写C++端的自定义结构体数据

结构体在QML中是无法被识别的,必须将结构体类型转换为QVariantMap或QVariant,或者将结构体封装到QObject子类中,在QObject子类中用Q_PROPERTY定义其成员。转成QVariantMap或QVariant的方式 也是需要先定义成QObject子类,而且QML端无法修改,所以最为简单的还是将结构体封装到QObject子类中

比如想要在QML中读写如下的自定义结构体数据

//定时采样
typedef struct
{
    int no;
    int enable;     //使能
    char time[16];  //时间(月-日 时:分)
}TIMING_SAMP_PARA_T;

//采样模式参数配置
typedef struct
{
    E_SAMP_MODE_T sampMode;       //采样模式 0:定时采样  1:时间等比 2:外控采样 3:流量等比 4:流量跟踪 5:液位触发
    int pipeSave;       //采样管存(S)
    int cycleTime;      //采样循环时间(S)

    TIMING_SAMP_PARA_T *timingSamp; //24个定时采样时刻,动态申请空间


    int timingSampCnt;

}SAMP_MODE_CFG_T;

2.1、QML获取C++类的自定义结构体数据

由于在该自定义结构体中还有嵌套的 TIMING_SAMP_PARA_T 结构体数据,且叫二级成员,没有嵌套的叫一级成员;对于一级成员,直接在QObject子类中使用Q_PROPERTY宏定义一个QML能访问的属性,并绑定其READ、WRITE、NOTIFY接口,就可以在QML端进行读取和修改了;对于二级成员,需要使用 Q_INVOKABLE 宏定义一个函数,函数的返回值为二级成员对应的QObject子类

1、定义二级成员---定时采样子类(timingsamppara.h/.cpp)

#ifndef TIMINGSAMPPARA_H
#define TIMINGSAMPPARA_H

#include <QObject>

class TimingSampPara : public QObject
{
    Q_OBJECT
public:
    explicit TimingSampPara(QObject *parent = nullptr);
    ~TimingSampPara();

    //枚举
    enum E_TIMINGSAMP_PARA
    {
        E_TIMINGSAMP_PARA_NO = 0,
        E_TIMINGSAMP_PARA_ENABLE,
        E_TIMINGSAMP_PARA_TIME,
        E_TIMINGSAMP_PARA_ALL
    };
    Q_ENUMS(E_TIMINGSAMP_PARA)

    int getNo() const;
    int getEnable() const;
    QString getTime() const;

    void setNo(int value);
    void setEnable(int value);
    void setTime(QString value);

    Q_PROPERTY(int no READ getNo WRITE setNo)
    Q_PROPERTY(int enable READ getEnable WRITE setEnable)
    Q_PROPERTY(QString time READ getTime WRITE setTime)

private:
    int no;
    int enable;    //使能
    QString time;  //时间(月-日 时:分)
};

#endif // TIMINGSAMPPARA_H

timingsamppara.cpp

#include "timingsamppara.h"
#include "global.h"

TimingSampPara::TimingSampPara(QObject *parent) : QObject(parent)
{
    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
}

TimingSampPara::~TimingSampPara()
{
    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
}

int TimingSampPara::getNo() const
{
    return no;
}

int TimingSampPara::getEnable() const
{
    return enable;
}

QString TimingSampPara::getTime() const
{
    return time;
}

void TimingSampPara::setNo(int value)
{
    no = value;
}

void TimingSampPara::setEnable(int value)
{
    enable = value;
}

void TimingSampPara::setTime(QString value)
{
    time = value;
}

2、定义一级成员---采样模式参数子类(modesetpara.h/.cpp)

#ifndef MODESETPARA_H
#define MODESETPARA_H

#include <QQuickItem>
#include "timingsamppara.h"
#include "global.h"

class ModeSetPara : public QQuickItem
{
    Q_OBJECT

public:
    explicit ModeSetPara(QQuickItem *parent = 0);
    ~ModeSetPara() override;

public:
    int getSampMode();
    int getPipeSave();
    int getCycleTime();

    void setSampMode(int value);
    void setPipeSave(int value);
    void setCycleTime(int value);

    Q_PROPERTY(int sampMode READ getSampMode WRITE setSampMode)
    Q_PROPERTY(int pipeSave READ getPipeSave WRITE setPipeSave)
    Q_PROPERTY(int cycleTime READ getCycleTime WRITE setCycleTime)

    Q_INVOKABLE void savePara(void);
    Q_INVOKABLE TimingSampPara *getTimingSampPara(int no);
    Q_INVOKABLE bool saveTimingSampPara(int no, const QVariantList &listpara);

private:
    SAMP_MODE_CFG_T sampModeCfg;
};

#endif // MODESETPARA_H

modesetpara.cpp

#include "modesetpara.h"
#include "global.h"
#include "xmlOp.h"

ModeSetPara::ModeSetPara(QQuickItem *parent):
    QQuickItem(parent)
{
    //从xml配置文件解析
    parseSampModeCfg(MODE_CONFIG_PATH, &sampModeCfg);
    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
}

ModeSetPara::~ModeSetPara()
{
    free(sampModeCfg.timingSamp);
    free(sampModeCfg.liquidLvlTrig);
    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
}

 // Write data into XML
void ModeSetPara::savePara(void)
{
    
    modifySampModePara(MODE_CONFIG_PATH, &sampModeCfg);
    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
}

int ModeSetPara::getSampMode()
{
    return sampModeCfg.sampMode;
}

int ModeSetPara::getPipeSave()
{
    return sampModeCfg.pipeSave;
}

int ModeSetPara::getCycleTime()
{
    return sampModeCfg.cycleTime;
}

void ModeSetPara::setSampMode(int value)
{
    sampModeCfg.sampMode = (E_SAMP_MODE_T)value;
}

void ModeSetPara::setPipeSave(int value)
{
    sampModeCfg.pipeSave = value;
}

void ModeSetPara::setCycleTime(int value)
{
    sampModeCfg.cycleTime = value;
}

 //获取二级结构体对应的QObject子类
TimingSampPara *ModeSetPara::getTimingSampPara(int no)
{
    // Assign value from structure to object
    TimingSampPara *pTimingSampPara = new TimingSampPara();
    pTimingSampPara->setNo(sampModeCfg.timingSamp[no].no);
    pTimingSampPara->setEnable(sampModeCfg.timingSamp[no].enable);
    pTimingSampPara->setTime(sampModeCfg.timingSamp[no].time);

    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);
    return pTimingSampPara;
}

bool ModeSetPara::saveTimingSampPara(int no, const QVariantList &listpara)
{
    if(TimingSampPara::E_TIMINGSAMP_PARA_ALL != listpara.size())
    {
        logPrintf(LOG_APP_TRACE, "%s failed! listpara.size=%d(less than %d)\n", Q_FUNC_INFO,
                  listpara.size(), TimingSampPara::E_TIMINGSAMP_PARA_ALL);
        return false;
    }

    // Assign value from variant to structure
    sampModeCfg.timingSamp[no].no = listpara[TimingSampPara::E_TIMINGSAMP_PARA_NO].toInt();
    sampModeCfg.timingSamp[no].enable = listpara[TimingSampPara::E_TIMINGSAMP_PARA_ENABLE].toInt();
    strncpy(sampModeCfg.timingSamp[no].time, listpara[TimingSampPara::E_TIMINGSAMP_PARA_TIME].toString().toStdString().c_str(),
            sizeof(sampModeCfg.timingSamp[no].time));

    // Write data into XML
    modifySampModePara(MODE_CONFIG_PATH, &sampModeCfg);

    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);

    return true;
}

3、在main.cpp中注册自定义对象

使用 qmlRegisterType,将自定义的QObject派生类注册到QML

qmlRegisterType<TimingSampPara>("MyTimingSampPara",1,0, "TimingSampPara");
qmlRegisterType<ModeSetPara>("MyModeSetPara",1,0, "ModeSetPara");

4、在QML中读取

import MyTimingSampPara 1.0
import MyModeSetPara 1.0

Item {

    width: 800
    height: 480
    visible: true

    ModeSetPara {
        id: modeCfgPara
    }

    Component.onCompleted: {
        //获取一级成员
        console.log("sampMode=" + modeCfgPara.sampMode)
        console.log("pipeSave=" + modeCfgPara.pipeSave)
        console.log("cycleTime=" + modeCfgPara.cycleTime)
        //设置一级成员
        modeCfgPara.sampMode = 0
        modeCfgPara.pipeSave = 21
        modeCfgPara.cycleTime = 31

        //获取二级成员
        var pTimingSampPara = modeCfgPara.getTimingSampPara(5)
        console.log("timingSamp[5]:")
        console.log("no=" + pTimingSampPara.no)
        console.log("enable=" + pTimingSampPara.enable)
        console.log("time=" + pTimingSampPara.time)
        //设置二级成员,收集界面数据后设置
        var arrTimingSampPara = []
        arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_NO] = 6
        arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_ENABLE] = 201
        arrTimingSampPara[TimingSampPara.E_TIMINGSAMP_PARA_TIME] =  "00-00 05:02"
        modeCfgPara.saveTimingSampPara(5, arrTimingSampPara)
    }
}

2.2、C++类接收QML传递的自定义数据

1、在QML中修改

对于一级成员直接修改属性值就可以了;对于二级成员,界面需要先收集界面的输入数据,使用 QVariantList 数据的形式暂时存储,再将其传递给C++类。使用QVariantList的原因是QVariantList以及QStringList在qml中是可以被识别的,可直接通过索引,比如 mList[i] 就可以访问,但是map就不能直接访问,需要做一些处理,没测试通!!

使用 QVariantList 设置的一个问题就是如何将索引与结构体变量对应起来,目前的方法是将结构体成员在 list 中的索引定义成枚举

2、C++接收QML传递的QVariantList变量后,将其转换成二级成员结构体

bool ModeSetPara::saveTimingSampPara(int no, const QVariantList &listpara)
{
    if(TimingSampPara::E_TIMINGSAMP_PARA_ALL != listpara.size())
    {
        logPrintf(LOG_APP_TRACE, "%s failed! listpara.size=%d(less than %d)\n", Q_FUNC_INFO,
                  listpara.size(), TimingSampPara::E_TIMINGSAMP_PARA_ALL);
        return false;
    }

    // Assign value from variant to structure
    sampModeCfg.timingSamp[no].no = listpara[TimingSampPara::E_TIMINGSAMP_PARA_NO].toInt();
    sampModeCfg.timingSamp[no].enable = listpara[TimingSampPara::E_TIMINGSAMP_PARA_ENABLE].toInt();
    strncpy(sampModeCfg.timingSamp[no].time, listpara[TimingSampPara::E_TIMINGSAMP_PARA_TIME].toString().toStdString().c_str(),
            sizeof(sampModeCfg.timingSamp[no].time));

    // Write data into XML
    modifySampModePara(MODE_CONFIG_PATH, &sampModeCfg);

    logPrintf(LOG_APP_TRACE, "%s success\n", Q_FUNC_INFO);

    return true;
}

3、在QML中获取C++端的Map类型

要在 C++和 QML 中使用 map 类型,不是直接使用 QMap,而是用 QVariantMap 来替换,QVariantMap 只是 QMap 的一个重定义的别名

typedef QVariantMap
Synonym for QMap<QString, QVariant>.

c++端定义如下:

#include <QObject>
#include <QVariant>
#include <QVariantMap>
#include <QVariantList>

class MyDemo : public QObject
{
    Q_OBJECT
    Q_ENUMS(Gender)
public:
    enum Gender
    {
        Boy,
        Girl
    }
    struct PeopleInfo
    {
        int year;      // 年龄
        int course ,   // 年纪
        Gender gender; // 性别
        QString name   // 名字
    };

public:
    MyDemo (QObject *parent = nullptr);
    ~MyDemo ();

    // 通过QVariantMap获取学生信息
    Q_INVOKABLE QVariantMap getCurrentStudentInfo(void)
    {
        QVariantMap map;
        map.clear();
        map.insert("year", m_studentInfo.year);
        map.insert("course ", m_studentInfo.course );
        map.insert("gender", m_studentInfo.gender);
        map.insert("name", m_studentInfo.name);
        return map;
    }
    // 通过QVariantList获取学生名字
     Q_INVOKABLE QVariantList getStudentNameList(void)
     {
            QVariantList varList;
            for (int i=0; i<m_studentNameList.count(); ++i)
            {
                varList.push_back(m_studentNameList.at(i));
            }
            return varList;
     }
     
private:
    // 学生信息
    PeopleInfo  m_studentInfo;
    QList<struct PeopleInfo> m_studentNameList;
};

qml端获取示例如下:

Item {
    function readValues(anArray, anObject) {
        for (var i=0; i<anArray.length; i++)
            console.log("Array item:", anArray[i])

        for (var prop in anObject) {
            console.log("Object item:", prop, "=", anObject[prop])
        }
    }
}

4、在QML中获取C++端的列表类型

要在 C++和 QML 中使用 list 类型,不是直接使用 QList,而是用 QVariantList 来替换,QVariantList 只是 QList 的一个重定义的别名


typedef QVariantList
Synonym for QList<QVariant>.

四、参考链接

C++与QML混合编程技术(传递自定义数据类型)_北星之茫的博客-CSDN博客_c++和qml混合编程

QML_Qml和C++混合编程_HX科技的博客-CSDN博客_qml c++混合编程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++与QML混合编程 的相关文章

  • Qt/Qml 和方法重载

    刚刚在 Qml 中调用重载的 C 方法时遇到了 Qt 框架的奇怪行为 并试图了解其背后的原因 假设我有一个QList
  • QML 中日期和时间的正则表达式(DD/MM/YYYY hh:mm:ss)

    在QML2中我没有找到任何Calender控件 我已经实现了一个以日期和时间作为输入的控件 并且我使用正则表达式进行验证 该验证与日期 包括闰年和其他验证 相匹配 主要问题是空格 退格键也应该被视为有效 例如 s s s s s s s s
  • 如何使用 qt5(QtQuick 2.1) 及更高版本在窗口上打印度数符号

    当我使用 qt4 8 qt fast 1 1 进行 gui 时 我可以成功地打印学位 260但是当升级到 qt5 及更高版本时 它就停止工作了 我在网上搜索 发现了很多相关链接 例如 http www fileformat info inf
  • 对于属性上的 NOTIFY 信号,如果我给它一个参数,会有什么区别?

    假设我有一个如下所示的类 class Something QObject Q PROPERTY int something READ getSomething NOTIFY somethingChanged signals void som
  • 如何为动态创建的 QML 元素添加事件处理程序?

    我根据以下内容动态添加了一些 qml 组件到我的 gui 中这篇博文 http kunalmaemo blogspot kr 2011 04 creating qml element dynamically on html 如何为这些新创建
  • 在 QML 中获取 $HOME 和/或用户名

    我需要知道如何获取用户的用户名和 或主目录 我用 google 搜索了一段时间 但只能找到 C 或 BASH 的变量 如何获取用户名或主目录 我正在用 QML 写作 这就是我的实现方式 Qml环境变量 h ifndef QMLENVIRON
  • 计算在鼠标光标位置放大的视图偏移

    我有一个 画布 用户可以在上面绘制像素等 它运行良好 但我的缩放功能当前使用相同的原点 无论鼠标的位置如何 我想实现类似 Google 地图缩放行为的功能 也就是说 缩放的原点应始终是鼠标光标的位置 我目前拥有的 https i stack
  • Qt3D动态纹理

    我正在开发包含 Qt3D 视图的软件 这个 3D 视图使我们能够可视化元素 对象的所有渲染部分都是使用自定义材质 着色器在 QML 中完成的 我能够创建一种将纹理传递到着色器以进行纹理化的材质 保存纹理的QML对象是Texture2D 它的
  • 由 Javascript 填充的 QML ListView

    我刚刚意识到 根据一些 QML Bugreport ListView 缺少 JSON Delegate 所以我有两个选择 通过用Javascript或C 创建的模型来填充它 特别是我需要从预定义的 URL 下载 json 数据并将它们解析到
  • 自定义 QML 模块部署到 Android:缺少 QML 依赖项

    我正在开发一个包含一些特殊类型的自定义 QML 模块 我们称之为 MyModule 它用作其他应用程序项目的预编译库 即源代码对它们不可用 它通过 import MyModule 1 0 设置必要的导入路径等来使用 该模块包含基于 C 的
  • Qml中的QScrollArea:Flickable + QQuickPaintedItem

    我正在尝试实现类似的东西QScrollArea 在小部件世界中 在 Qml 的帮助下 我决定一探究竟Flickable plus QQuickPaintedItem基于项目 在我的例子中名为抽屉 Flickable onContentXCh
  • Qt、QML 和 Windows 8 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直对Qt框架引入的QML很好奇 但从未有机会使用它 但现在随着 Windows 8 的到来 基于旧式小部件的界面将变得过时 只是我
  • 部署 Qt Quick 演示应用程序 Minehunt 时出现全白屏幕

    为了测试部署过程 我尝试部署附带的演示应用程序 Minehunt 我能够让它运行 没有崩溃或错误 但屏幕是全白的 我相信这通常意味着我缺少插件 Dependency walker 报告没有问题 我什至尝试包含 Qt MingW 插件目录中的
  • Qt QML ComboBox 覆盖滚轮事件

    有没有办法覆盖 ComboBox MouseArea 以忽略滚轮事件而不是更改当前索引 ComboBox 本身没有选项可以更改滚轮焦点行为 到目前为止 我尝试使用如下代码覆盖 CB MouseArea 的 onWheel ComboBox
  • QML 适合所有分辨率的屏幕

    大家好 我的 QML 代码有问题 我犯了一个错误 我给元素设置了一定的大小 现在我在将应用程序放在其他设备上时遇到了问题 我会将我的代码粘贴到有宽度和高度的位置 以便您可以更改它以向我展示如何使用动态调整大小 我需要说我正在使用以下代码从
  • 无法锚定到不是父级或同级 QML QtQuick 的项目

    我正在使用 QML 开发 python 桌面应用程序 我的 QML 文件中有这个 SplitView anchors fill parent orientation Qt Horizontal Rectangle color 272822
  • QML 项目的 QtCreator 中未启用“运行”按钮

    我在Windows XP上使用基于QT 4 7 4 32位 的QTCreator 2 2 1 我从 new gt QML 项目菜单创建了一个 QML 项目 但 RUN 按钮未启用 如何运行 QML 项目 您是否创建了新的 QML 文件而不是
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes

随机推荐

  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • xv6---Lab3: page tables

    目录 参考资料 RISC V页表的简化图如下所示 编辑 多级页表 xv6内核页表 3 6 Process Address Space 3 7 Code Sbrk 3 8 Code Exec Print a page table A kern
  • 内存管理---分页机制

    目录 物理内存管理带来的问题 直接映射 一级页表 二级页表 参考 xff1a xff08 C语言内存七 xff09 分页机制究竟是如何实现的 xff1f Smah 博客园 物理内存管理带来的问题 比如4GB的flash 如果应用程序可直接访
  • xv6---Lab4 traps

    参考 xff1a Lab Traps 关于寄存器s0和堆栈 https pdos csail mit edu 6 828 2020 lec l riscv slides pdf RISC V assembly Q 哪些寄存器包含函数的参数
  • stm32F4 hal库之CAN通信的实现

    本文的目的是为了能够实现功能 xff0c 故写的时候比较简略 参考资料 xff1a https blog csdn net u012308586 article details 81001102 正点原子开发手册 目标 xff1a 通过ca
  • 调试sim800L模块

  • 51单片机 串口中断

    1 什么是中断 广义上的中断是指一个过程 xff0c 举个简单的例子 xff0c 打开了电脑 xff0c 你正在放音乐 xff0c 点击了暂停按钮 xff0c 于是歌停了 这就是一个很明显的中断的例子 CPU正在做自己的事情 xff08 放
  • STM32CubeMX应用 -- 定时器输入脉冲计数

    目录 参考链接 一 实现过程 二 STM32CubeMX配置示例 三 C语言示例程序 参考链接 https blog csdn net m0 37845735 article details 105395643 一 实现过程 当选择外部的同
  • 机器人导航dwa(局部避障)分析

    前面部分引用http blog csdn net lqygame article details 72861439 xff08 1 xff09 初始化 xff1a 在move base节点中 xff0c 通过类加载模块载入了BaseLoca
  • 2019年最新VSLAM比较汇总

    2019年最新VSLAM比较汇总 闭源SOFTSOFT2ESOsGAN VOLG SLAMRotRocc 43 GDVOElbrusROCCMonoROCCcv4xv1 sc 开源 xff1a VINS FusionORB SLAM2Ste
  • CMSIS到底是个什么东西

    目录 一 前言 二 CMSIS标准 三 CMSIS文件 1 Include文件 2 Source文件 四 总结 一 前言 使用过ARM单片机的朋友肯定听说过CMSIS xff0c 可以说CMSIS是开启ARM单片机的金钥匙 xff0c 是不
  • TouchGFX介绍

    目录 一 关于TouchGFX 1 TouchGFX是一个图形框架 2 TouchGFX可以减轻CPU负载 3 TouchGFX充分利用了STM32的硬件图形外设 4 TouchGFX创建最佳性能的用户界面 5 TouchGFX可工作于ST
  • rt-thread应用篇(03)---基于STM32F429实现web服务器功能

    目录 参考示例 前言 一 需使用的组件与软件包及其ENV配置 1 文件系统相关组件与软件包 1 1 DFS 框架 1 2 fal 软件包 1 3 SFUD 组件 2 网络通信相关组件和软件包 2 1 SAL组件 2 2 netdev组件 2
  • rt-thread的at组件在freeRTOS上的移植与应用

    目录 一 AT命令 二 rtthread at组件简介 三 移植到freeRTOS 3 1 数据结构 3 2 API 3 3 at client 流程 3 4 串口数据接收处理 3 5 数据缓存 顺序队列 四 使用示例 4 1 串口配置信息
  • rt-thread驱动篇(04)---STM32F429单片机模拟SPI FLASH驱动添加

    目录 一 添加驱动 1 新增模拟SPI驱动文件 drv soft spi c h 2 新增模拟SPI配置文件 soft spi config h 二 向工程添加文件 1 修改 board Kconfig 2 修改 rt thread com
  • RT-Thread实时操作系统简介

    目录 一 概述 二 架构 三 版本选择 四 内核启动流程 五 自动初始化机制 六 内核对象模型 七 I O设备模型 1 框架 2 设备驱动使用序列图 3 设备类型 八 FinSH控制台 九 ENV工具 1 menuconfig 2 Scon
  • Altium Allegro PADS到底该选哪个EDA设计软件

    废话少说 xff0c 就像之前 学好数理化 xff0c 走遍天下都不怕 一样 xff0c 在如今快速发展的电子时代 xff0c 掌握一门电子设计EDA软件工具 xff0c 在职场上真的走遍天下都不怕 哪哪都有可能跟电沾边 xff0c 跟控制
  • QML学习笔记【07】:QML访问复杂组件的子项

    1 访问复杂组件的子项 gt Row Column Grid Flow布局子项或Repeater子项 访问复杂组件的子项 gt Row Column Grid Flow布局子项或Repeater子项 Window width 640 hei
  • tslib-1.4在I.MX6ULL开发板上电容屏不能触摸问题

    一 前言 在采用触摸屏的移动终端中 xff0c 触摸屏性能的调试是个重要问题之一 xff0c 因为电磁噪声的缘故 xff0c 触摸屏容易存在点击不准确 有抖动等问题 Tslib是一个开源的程序 xff0c 能够为触摸屏驱动获得的采样提供诸如
  • C++与QML混合编程

    一 前言 简单来说 xff0c 混合编程就是通过Qml高效便捷的构建UI界面 xff0c 而使用C 43 43 来实现业务逻辑和复杂算法 Qt集成了QML引擎和Qt元对象系统 xff0c 使得QML很容易从C 43 43 中得到扩展 xff