1. 程式人生 > >7.QML中的訊號和訊號處理

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+

QtQEvent訊號槽的區別

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

Linuxziptar處理軟鏈接的差異與選擇

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

QMLFRAMELESS 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_SOFTSPI_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. 自定