QT5:第八章 元對象

一.簡介

QT使用元對象編譯器(Meta Object Compiler,moc),實現了元對象(Meta Object System,mos)機制,爲標準C++增長了一些特性:編程

  • 信號槽機制,用於解決對象之間的通信
  • 可查詢可設計的對象屬性
  • 強大的事件機制以及事件過濾器
  • 基於上下文的字符串翻譯機制(國際化),用 tr() 函數實現
  • 複雜的定時器實現,用於在事件驅動的GUI中嵌入可以精確控制的任務集成
  • 層次化的可查詢的對象樹,提供一種天然的方式管理對象關係
  • 智能指針(QPoint),在對象析構以後自動設爲0,防止野指針
  • 可以跨越庫邊界的動態轉換機制

 

元對象系統是基於如下3個條件:函數

(1)基類QObject:任何須要使用元對象系統功能的類必須繼承自QObject類ui

(2)Q_OBJECT宏:必須在類的私有聲明區聲明Q_OBJECT宏(默認爲private)this

(3)元對象編譯器(Meta-Object Compiler,moc):爲QObject子類實現元對象特性提供必要的代碼spa

 

 

二.信號槽

QT編程中信號與槽用於處理界面各個組件的交互,相似與MFC的消息循環和綁定翻譯

注意:在使用信號與槽的類中,必須在類的定義中加入宏定義Q_OBJECT設計

 

 信號(Signal)就是在特定狀況下被髮射的時間,相似於鼠標單擊時發生clicked()信號指針

 

 槽(Slot)是對信號響應的函數code

 

1.ui文件設計信號與槽函數

在須要設計槽的控件(觸發控件)上右鍵->轉到槽     對象

或者直接按下F4進入快速選擇信號和槽函數

選擇相應的信號以後就會跳轉到該信號函數

 

  • lineEdit 文本編輯框

    textChanged(QString)

    testEdited(QString)   

  • pushButton 按鈕

    clicked()

    clicked(bool)

    pressed()

 

//helloDialog.h

class HelloDialog : public QMainWindow {

// 聲明槽函數
private slots:
    void on_pushButton_clicked();
}

 

//helloDialog.cpp

void HelloDialog::on_pushButton_clicked() {

    ui->lineEdit->setText("k5");
}

 

2.內置的信號與槽函數

若是不在.ui文件裏面直接綁定,就必須用connect()進行綁定

 

 connect(

ui文件下的控件名稱

控件自帶的信號函數

自定義的對象

自定義的槽函數

)

 

//helloDialog.h

class HelloDialog{
    
public:
    void initSignalSlots();  //初始化信號與槽鏈接

// 聲明槽函數 private slots: void changeData(); }

 

//helloDialog.cpp

void HelloDialog::initSignalSlots() {
    
    connect(ui->pushButton,SIGNAL(cliked()),this,SLOT(changeData));
}

void HelloDialog::changeData(){
    ui->lineEdit->setText("k5");
}

 

3.自定義信號和槽函數

除了使用QT內置的信號函數和槽函數,也能夠自定義信號和槽函數.

建立兩個類繼承QObject類,添加Q_Object宏,用signals和slots標記信號和槽函數

 

// test.h

#ifndef TEST_H
#define TEST_H

#include <QObject>
#include <QDebug>

class test : public QObject
{
    Q_OBJECT

public:
    test();

    void send(){
        emit testcall();
    }

signals:
    void testcall();

public slots:
    void testreveive();

}

#endif  // TEST_H

 

// test.cpp

#include "test.h" test::test() { } void test::testreceive(){ qDebug() << "receive"; }

 

 

// mainwindow.cpp

#include "ui_mainwindow.h"
#include "test.h"

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    test t;
    connect(&t, &test::testcall, &t, &test::testreceive);
    t.send();
}

 

注意:使用 signals 標記信號函數,信號是一個函數聲明,返回void,不須要實現函數代碼

  使用 emit 能夠發送信號

 

三.屬性

相關文章
相關標籤/搜索