7.QML中的訊號和訊號處理
1. 訊號處理器
QML中使用on+訊號的方式作為訊號處理器,來處理所所傳送的訊號。比如相應按鈕的點選事件,程式碼如下:
Button {
text: '退出'
anchors.centerIn: parent
onClicked: {
Qt.quit()
}
}
clicked為點選按鈕所發出的訊號,與QPushButton發出的clicked訊號是相同的,而使用onClicked作為訊號的處理器,點選按鈕後,相應大括號({})中的語句,即Qt.quit(),程式退出。
2. 附加訊號處理器
QML語言的語法中,有一個附加屬性和附加訊號處理器的概念,這是附加到一個物件的額外屬性。下面是附加屬性和附加訊號處理器的簡單用法:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
Window {
id: mainWindow
width: 800
height: 600
visible: true
Rectangle {
anchors.fill: parent
Button {
text: '退出'
anchors.centerIn: parent
onClicked: {
Qt.quit ()
}
}
Text {
id: text
text: ''
anchors.top: parent.top
anchors.topMargin: 10
anchors.horizontalCenter: parent.horizontalCenter
}
Keys.enabled: true
focus: true
Keys.onPressed: {
if (event.key === Qt.Key_Up)
text.text = 'Has Pressed Up Key'
else if (event.key === Qt.Key_Down)
text.text = 'Has Pressed Down Key'
else if (event.key === Qt.Key_Left)
text.text = 'Has Pressed Left Key'
else if (event.key === Qt.Key_Right)
text.text = 'Has Pressed Right Key'
}
}
}
當按鍵盤的上、下、左、右按鍵時,顯示不同的字串。
3. Connections
Connections物件建立一個到QML訊號的連線。
- target: 指向發出訊號的物件。
- 使用on + 訊號的方式相應訊號處理。
Button {
id: button
text: '退出'
anchors.centerIn: parent
}
Connections {
target: button
onClicked: {
Qt.quit()
}
}
這個效果同上面的實現。C++中定義的訊號,也可以使用Connections連線並處理訊號的相應。
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import Demos.SignalDeno 1.0
Window {
id: mainWindow
width: 800
height: 600
visible: true
Rectangle {
anchors.fill: parent
SignalDemo {
id: signalDemo
}
ColumnLayout {
anchors.centerIn: parent
Text {
id: text
text: ''
}
Button {
id: button
text: '確定'
onClicked: {
signalDemo.callTestSignal()
}
}
Connections {
target: signalDemo
onTestSignal: {
text.text = 'Recved Test Signals'
}
}
}
}
}
C++中的標頭檔案:
#ifndef SIGNAL_DEMO_H
#define SIGNAL_DEMO_H
#include <QObject>
class SignalDemo : public QObject
{
Q_OBJECT
public:
SignalDemo(QObject *parent = nullptr);
~SignalDemo();
// 呼叫訊號函式
Q_INVOKABLE void callTestSignal(void);
signals:
void testSignal(void);
};
#endif
C++中的原始檔:
#include "SignalDemo.h"
SignalDemo::SignalDemo(QObject *parent)
:QObject(parent)
{
}
SignalDemo::~SignalDemo()
{
}
void SignalDemo::callTestSignal(void)
{
emit testSignal();
}
4. 使用connect()函式連線訊號和槽
Qt C++中可以使用QObject::connect()的方式連線訊號和槽,QML中也有類似的方法,就是使用signal.connect()連線訊號和槽,當然也可以訊號連線訊號;有connect()方法當然也有disconnect()方法去斷開訊號和槽函式的連線。下面是使用signal.connect()改寫上面的訊號和槽的連線,可以達到相同的效果:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import Demos.SignalDeno 1.0
Window {
id: mainWindow
width: 800
height: 600
visible: true
Rectangle {
anchors.fill: parent
SignalDemo {
id: signalDemo
}
ColumnLayout {
anchors.centerIn: parent
Text {
id: text
text: ''
}
Button {
id: button
text: '確定'
onClicked: {
signalDemo.callTestSignal()
}
}
function disposeTestSignal() {
text.text = 'Recved Test Signals'
}
Component.onCompleted: {
// 連線訊號和處理的槽函式
signalDemo.testSignal.connect(disposeTestSignal)
}
// Connections {
// target: signalDemo
// onTestSignal: {
// text.text = 'Recved Test Signals'
// }
// }
}
}
}
5. 自定義訊號
使用QML的自定義訊號,可以使用如下形式:
signal name [type parameterName, …]
傳送訊號,可以直接使用函式即可;下面是一個簡單的示例:
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
Window {
id: mainWindow
width: 800
height: 600
visible: true
Text {
id: text
text: 'This is Test Txt!'
font.pixelSize: 35
anchors.centerIn: parent
function textColorChange(clr) {
text.color = clr
}
Component.onCompleted: {
button1.sendThisColor.connect(textColorChange)
button2.sendThisColor.connect(textColorChange)
}
}
Rectangle {
id: button1
width: 80
height: 80
anchors.left: parent.left
anchors.leftMargin: 5
anchors.bottom: parent.bottom
anchors.bottomMargin: 5
color: Qt.rgba(1.0, 0, 0)
signal sendThisColor(color rectColor)
MouseArea {
anchors.fill: parent
onClicked: {
button1.sendThisColor(button1.color)
}
}
}
Rectangle {
id: button2
width: 80
height: 80
anchors.left: button1.right
anchors.leftMargin: 5
anchors.bottom: parent.bottom
anchors.bottomMargin: 5
color: Qt.rgba(0.0, 0.0, 1.0)
signal sendThisColor(color rectColor)
MouseArea {
anchors.fill: parent
onClicked: {
button2.sendThisColor(button2.color)
}
}
}
}
效果如下圖所示:
相關推薦
7.QML中的訊號和訊號處理
1. 訊號處理器 QML中使用on+訊號的方式作為訊號處理器,來處理所所傳送的訊號。比如相應按鈕的點選事件,程式碼如下: Button { text: '退出' anchors.centerIn: parent on
QML 訊號和訊號處理器程式
簡述 訊號和槽作為 Qt 的核心機制,在 Qt 程式設計中有著廣泛的應用。同樣,QML 也繼承了這樣的特性 - 訊號和訊號處理程式 ,只不過叫法上略有不同。 訊號:來自 QML 物件的通知。 訊號處理程式:由訊號觸發的表示式(或函式),也被稱為 Qt C+
Qt中QEvent和訊號槽的區別
4.Qt::AutoConnectionIf the signal is emitted from the thread in which the receiving object lives, the slot is invoked directly, as with Qt::DirectConnectio
Linux中zip和tar處理軟鏈接的差異與選擇
Linux zip tar 處理 Linux中zip和tar處理軟鏈接的差異與選擇 系統環境 cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) getenforce Disabled 安裝zip,unzip #直接yu
php中 ord() 和 chr() 處理 utf8 字符串
處理 emp enc ise eas 不能 () info func ord() : 將字符轉為 ascii 碼 (0-256),準確定義官方文檔:http://php.net/manual/en/function.ord.php chr() : 將 ascii 碼轉為字
linux 詳細訊號列表及Linux訊號和訊號集
轉自: http://blog.51cto.com/vabc1314/1844888 SIGHUP 終止程序 終端線路結束通話[喝小酒的網摘]http://blog.hehehe
QML中FRAMELESS 和 transparent 窗體的拖動實現
之前的blog中寫到如何設定窗體無邊框以及設定背景透明,參考 因為,窗體設定成無邊框之後,窗體的拖動就要靠自己寫的程式來完成了! 本文參考Resize Qml window這篇文章,結合自己的需求解決了拖動窗體的需要! 首先,介紹上面這個參考文章裡的解決方法: 核心思想是
qml中註冊和使用C++物件,以及在qml中實現窗體最大最小化
在main函式中相關程式碼如下: QApplicationapp(argc,argv); QDeclarativeViewview; //將app註冊到qml中,方便對主程式的退出,最大最小化等相關操作 view.rootContext()->setCont
Linux 程序通訊之 ——訊號和訊號量總結
現在最常用的程序間通訊的方式有:訊號,訊號量,訊息佇列,共享記憶體。 所謂程序通訊,就是不同程序之間進行一些"接觸",這種接觸有簡單,也有複雜。機制不同,複雜度也不一樣。通訊是一個廣義上的意義,不僅僅指傳遞一些massege。他們的使用方法是基本相同的,所以只要
Linux 訊號和訊號集
訊號是linux所使用的程序間通訊的最古老的方式。它是在軟體層次上對中斷機制的一種模擬,是一種非同步通訊的方式 。一個完整的訊號週期包括三個部分,訊號的產生,訊號在程序中的註冊,訊號在程序中的登出,執行訊號處理函式。如下圖所示: 注意:這裡訊號的產生,註冊,登出時訊號的內
PyQt中處理訊號和槽時遇到的問題和解決方法
做老師佈置的大作業用了PyQt,然後訊號與槽的部分要傳入引數,研究了半天,最後找到一篇不錯的教程(源地址:http://frymgump.iteye.com/blog/846557): 昨天在群裡一個朋友提出了一個問題,要求在PyQt中click一個pu
qt訊號和槽問題(變數只在槽函式中改變問題)
在連結一個類A和另一個類B一個物件的時候, 如果在A類物件中定義物件B,只使用B x方式定義,需要在connect第三個槽引數中使用引用,大部分情況是在A中new一個B的物件,便可以直接使用connect. A *x[24]=A *(x[24]); 然而在實際運用中,發生了這樣神奇的情況
訊號處理中的實訊號與覆信號
轉載:原部落格地址:http://blog.sina.com.cn/s/blog_5dfd405d0101iyq7.html 訊號處理中為什麼用覆信號 (2013-03-24 18:25:55) 標籤: 雜談
PyQt5之多行文字框(QtextEdit)類中的常用方法和訊號
PyQt5之QtextEdit類中的常用方法和訊號 一、QTextEdit類中的常用方法 setPlainText(): 設定多行文字框的內容。 toPlainText(): 返回多行文字框的文字內容。 setHtml(): 設定多行文
PyQt之單行文字框(QLineEdit)類中的常用方法和訊號
QLineEdit類中的常用方法和訊號 一、QLineEdit類中的常用方法 setAlignment(): 按固定方式對齊文字: Qt.AlignLeft:水平方向靠左對齊 Qt.AlignRight:水平方向靠右對齊 Qt.AlignCenter:水平方向居
PyQt之標籤(QLabel)類中的常用方法和訊號
一、Qlabel類中的常用方法 setAlignment(): 按固定值方式對其文字: Qt.AlignLeft:水平方向靠左對其 Qt.AlignRight:水平方向靠右對其 Qt.AlignCenter:水平方向居中對其 Qt.AlignJustify:水平
[譯]關於SPI通訊中片選訊號的選擇SPI_NSS_SOFT和SPI_NSS_HARD_OUTPUT以及SPI_NSS_HARD_INPUT
以下文章來自外網翻譯,侵刪 在ST官方程式碼中,SPI常見配置如下 Init structure: hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTI
Qt中通過訊號和槽在子執行緒和主執行緒中進行資料傳遞
QT中兩個執行緒之間進行自定義型別資料傳遞 兩個執行緒中進行資料傳遞時,傳遞的資料放到佇列中(queue),所以在這個過程中,需要在傳遞前將資料拷貝、儲存到佇列中;為了儲存這些引數,Qt需要construct、destruct、copy這些物件,為了讓Qt知道
深入理解Qt訊號和槽機制、訊號和槽中的Lambda表示式
對於事件處理,MFC中使用的是訊息對映機制,Qt使用的是訊號和槽機制,在我看來,Qt的訊號和槽比MFC功能更強大,也更靈活。1、訊號和槽的簡單介紹: 一般格式: connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
QML知識-使用Qt訊號和方法
在實際中開發QML應用,會經常用到訊號這一屬性。像onClicked,onDoubleClicked是非同步操作,它們多由訊號觸發完成。有時候需要與Qt/C++進行資料通訊時候,使用Qt的訊號機制往往可以提高程式設計效率的效果。 1. 自定