QT QML一些技术积累

1,847次阅读
没有评论

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
正文完
 0
评论(没有评论)