qml信号槽
❶ 如何用c++模拟qt 信号和槽机制
说明:
写一个测试程序测试qml和c++利用信号槽机制传输信息.
测试程序功能:16进制和10进制互相转换.
源代码:
main.cpp
?
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
30
31
32
33
34
35
#include <qtgui qguiapplication="">
#include qtquick2applicationviewer.h
#include <qtqml qqmlcontext="">
#include <qtquick qquickitem="">
#include <qtquick qquickview="">
#include myclass.h
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
MyClass my;
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStrin
❷ 如何在C++代码中连接QML代码中的信号
思路是这样的,但是没实现.
在你的 C++ 代码中定义一个 QML基础类型的 属性 将QML作为对象传入C++代码中,
在C++代码中写写判断,当该属性有值的时候 链接信号到C++槽中
或者 你QML的信号触发的时候 调用C++代码的 信号 (前提是要将C++ 注册成一个QML类型,参考该Writing QML Extensions with C++例(Qt 自带的))
其中有这么一段(chapter2-methods中) 将aPieChart.clearChart()的clearChart 定义为你的信号就可以了
PieChart {
id: aPieChart
anchors.centerIn: parent
width: 100; height: 100
color: "red"
onChartCleared: console.log("The chart has been cleared")
}
MouseArea {
anchors.fill: parent
onClicked: aPieChart.clearChart()
}
❸ c++中发送一个信号qml怎么接收和处理信号
非常实用、在程序里面经常需要用到。要想在QML中使用定时器、首先你得在程序的.cpp文件中加上一句qmlRegisterType<QTimer>(“timer”, 1, 0, “Timer”),这句是为了注册这个类,因为Cascades/QML本身是没有这个类的; 然后在QML文件包含它import timer 1.0好了。这些准备工作完成之后你就可以使用Qt的定时器了。 attachedObjects: [
Timer { id: mytimer interval: 500 onTimeout: { console.log("the time is out") } }]mytimer.start() 开启定时器mytimer.stop() 关闭定时器 更多的信息请大家查阅官方API。
在onTimeout这个信号里面你可以写自己需要的功能代码、interval则是定时器完成一次计时的时间、单位是毫秒。下面写一个简单的例子大家感受下计时器的具体用法。
import timer 1.0//将注册好的timer包含进来Page { property bool isOnclicked: false property bool isChanged: false attachedObjects: [ Timer { id: mytimer interval: 500//一次定时器的时间、单位为毫秒 onTimeout: { isChanged = ! isChanged if (isChanged) cont.background = Color.Green; else cont.background = Color.Red//开启定时器后背景色红绿交替变换。 } } ] Container { id: cont preferredHeight: 1280 preferredWidth: 768 background: Color.Red layout: DockLayout { } Button { id: btn verticalAlignment: VerticalAlignment.Center horizontalAlignment: HorizontalAlignment.Center text: “ON/OFF” onClicked: { isOnclicked = ! isOnclicked if (isOnclicked) mytimer.start();//启动定时器 else mytimer.stop()//停止定时器 } } }}
❹ 在QML语言中怎么定义signal并怎么正确使用
三种方法。一种是直接把信号的第一个字母变为大写, 并同时在前面加上"on“。第二种方法使用”Connections"来实现槽的连接。第三种方法,我们可以直接 把信号连接到一个JS的函数上。运行程序,我们可以在应用的输出窗口看到如下的输出:
[cpp] view plain
green light is on
yellow light is on
red light is on
red light is on
yellow light is on
green light is on
yellow light is on
red light is on
red light is on
yellow light is on
事实上所有的控件的property都可以发出一个信号。让我们来看一下我们先前完成的“color” property。
[cpp] view plain
void TrafficLight::setColor(const QColor &color)
{
if ( color == m_color )
return;
else {
m_color = color;
update(); // repaint with the new color
emit colorChanged();
}
}
从这里可以看出,每当property的值发生改变时,就会发生一个叫做“colorChanged”的信号。我们可以在我们的QML中截获这个信号。比如在我们的代码中,我们可以使用如下的代码:
[cpp] view plain
TrafficLight{
id: redlight
width: background.size
height: background.size
color:"red"
onColorChanged: {
console.log("Color is changed to " + color);
}
}
当我们运行时,我们可以看到好多的颜色变化的事件。这是由于颜色在transition时发生很多的颜色的变化。同样我们也可以对任何一个property进行事件的捕获。比如:
[cpp] view plain
TrafficLight{
id: redlight
width: background.size
height: background.size
color:"red"
onColorChanged: {
console.log("Color is changed to " + color);
}
onWidthChanged: {
console.log("width is changed to " + width);
}
}
这段代码可以对"width"的变化进行捕获!