qml C++交互
QML中访问C++成员及函数.
很简单,只要C++类是继承QObject
, 然后使用Q_PROPERTY
与Q_INVOKABLE
来定义函数,就可以直接在QML中调用.Q_PROPERTY
与Q_INVOKABLE
的用法在网上很多,并且简单,这里不详细描述.
C++ 调用 QML函数
C++直接访问QML中变量及函数稍麻烦,我用其中最简单的方式 <信号与槽>
具体是在C++中发送信号, QML中槽函数进行接收. C++中发送信号与其他任何时候都一样,不在这里描述. QML中接收C++信号的方式如下
1 2 3 4 5 6 7 8 9 |
// 假如C++中有这样一个信号 void toQmlMsg(QString msg), jmain是注册到QML中的类 Connections { target:jmain //qml 连接 c++ 信号 onToQmlMsg:{ console.log(msg); } } |
右键弹出菜单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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
1 2 |
var absMouseXY = mapToItem(root, mouseX, mouseY); |
sqlite 大量写入时性能差
这个问题应该是sqlite本身问题.需要使用事务来解决大量写入性能问题.QT本身带有此函数
1 2 3 4 5 6 7 8 9 |
void jdb::transaction() { db.transaction(); } void jdb::commit() { db.commit(); } |
MSVC乱码
在头文件中增加定义
1 2 3 4 |
#ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif |