QT QML一些技术积累


qml C++交互

QML中访问C++成员及函数.

很简单,只要C++类是继承QObject, 然后使用Q_PROPERTYQ_INVOKABLE来定义函数,就可以直接在QML中调用.Q_PROPERTYQ_INVOKABLE的用法在网上很多,并且简单,这里不详细描述.

C++ 调用 QML函数

C++直接访问QML中变量及函数稍麻烦,我用其中最简单的方式 <信号与槽>
具体是在C++中发送信号, QML中槽函数进行接收. C++中发送信号与其他任何时候都一样,不在这里描述. QML中接收C++信号的方式如下

// 假如C++中有这样一个信号  void toQmlMsg(QString msg), jmain是注册到QML中的类
Connections
{
    target:jmain     //qml 连接 c++ 信号
    onToQmlMsg:{
        console.log(msg);
    }
}

右键弹出菜单

Menu {
    id: menu
    MenuItem {
        text: "菜单1"
    }
    MenuItem {
        text: "菜单2"
    }
    MenuItem {
        text: "菜单3"
    }
}
...
Item{
    id: xxx;
    anchors.fill: parent;
    acceptedButtons: Qt.LeftButton | Qt.RightButton;
    onClicked: {
        if (mouse.button == Qt.RightButton) {
            var absMouseXY = mapToItem(root, mouseX, mouseY);
            menu.x = absMouseXY.x
            menu.y = absMouseXY.y
            menu.open()
        } else {
            console.log("MouseArea LeftButton");
        }
    }
}

获取相对/绝对的鼠标位置

参见右键弹出菜单例子,关键词mapToItem

var absMouseXY = mapToItem(root, mouseX, mouseY);

sqlite 大量写入时性能差

这个问题应该是sqlite本身问题.需要使用事务来解决大量写入性能问题.QT本身带有此函数

void jdb::transaction()
{
    db.transaction();
}
void jdb::commit()
{
    db.commit();
}

MSVC乱码

在头文件中增加定义

#ifdef _MSC_VER
    #pragma execution_character_set("utf-8")
#endif

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注