在QML中使用函数和槽

在QML中可以有条件地访问QObject子类的函数。这些条件是:

  • 使用Q_INVOKABLE宏标记的public函数
  • public槽函数

现在我们来实现这两种函数,然后在QML中调用。

#ifndef MYVIEWMODEL_H
#define MYVIEWMODEL_H

#include <QObject>

class MyViewModel : public QObject
{
    Q_OBJECT
    explicit MyViewModel(QObject *parent = nullptr);
    Q_INVOKABLE bool onClicked(QString args);
    
public slots:
    void refresh();
};
#endif // MYVIEWMODEL_H

上述代码中,主要有两个函数:

  • onClicked函数,被Q_INVOKABLE宏标记了,并且有参数和返回值。
  • 一个public槽函数,没有参数和返回值。

源文件如下:

#include <stdio.h>
#include "MyViewModel.h"
#include "qdebug.h"

MyViewModel::MyViewModel(QObject *parent)
    : QObject{parent}
{

}

bool MyViewModel::onClicked(QString args)
{
    qDebug()<<"onClicked's args:"<<args;

    return true;
}

void MyViewModel::refresh()
{
   qDebug()<<"refresh";
}

在main函数中我们加数据传递给QML中:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MyViewModel.h"


int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QGuiApplication app(argc, argv);

    MyViewModel viewModel();
    QQmlApplicationEngine engine;
    QQmlContext* context=engine.rootContext();
    context->setContextProperty("viewModel",QVariant::fromValue(&viewModel));

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    engine.load(url);

    return app.exec();
}

然后在QML中使用:

        Button {
            text: qsTr("button")
            onClicked: {
                var ret = viewModel.onClicked(text)
                console.log("onClicked ret=" + ret)

                viewModel.refresh()
            }
        }

我们在onClicked事件中直接调用。但是槽函数其实也可以带参数和返回值的。

QMLQt Multi-touch Application Library),`MultiPointTouchArea`是一个组件,用于处理多点触摸事件,例如手指的触碰、移动和离开。它的主要函数包括: 1. **touchStart**: 当第一个手指触摸屏幕时触发,传递一个`TouchEvent`对象,包含开始触摸的信息,如触摸点的位置、压力等。 ```qml onTouchStart: { // 执行初始化操作 } ``` 2. **touchMove**: 指定区域内手指移动时触发,每次有一个或多个手指移动都会引发此事件,传递当前所有触摸点的状态。 ```qml onTouchMove: { // 更新基于触摸点的位置的UI状态 } ``` 3. **touchEnd**: 当手指从屏幕上抬起或离开指定区域时触发,传递最后一个离开的触摸点信息。 ```qml onTouchEnd: { // 清理或结束与该触摸相关的操作 } ``` 4. **touchCancel**: 如果触摸过程被意外断(比如手势识别系统认为不再是一次有效的触摸),则会触发此事件。 ```qml onTouchCancel: { // 清除可能存在的临时状态 } ``` 5. **touchPressureChanged**: 当触摸点的压力发生变化时,可以捕捉到这个事件。 ```qml onTouchPressureChanged: { // 根据压力调整UI反馈或交互 } ``` 6. **multiTouchMoved**: 对于多点触摸,表示至少两个以上的触摸点在区域内移动时触发,包含所有触摸点的移动信息。 ```qml onMultiTouchMoved: { // 处理多点触摸的组合事件 } ``` 7. **multiTouchEnded**: 当多点触摸的所有手指都离开屏幕时触发。 ```qml onMultiTouchEnded: { // 结束多点触摸事件的处理 } ``` 注意,每个函数都接收一个`TouchEvent`对象作为参数,通过它可以获取到详细的触摸信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值