qml C++ 交互
QML 中访问 C ++ 成员及函数.
很简单, 只要 C ++ 类是继承 QObject
, 然后使用Q_PROPERTY
与Q_INVOKABLE
来定义函数, 就可以直接在 QML 中调用.Q_PROPERTY
与 Q_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
正文完