QT5:第八章 元对象

一.简介

QT使用元对象编译器(Meta Object Compiler,moc),实现了元对象(Meta Object System,mos)机制,为标准C++增加了一些特性:

  • 信号槽机制,用于解决对象之间的通讯
  • 可查询可设计的对象属性
  • 强大的事件机制以及事件过滤器
  • 基于上下文的字符串翻译机制(国际化),用 tr() 函数实现
  • 复杂的定时器实现,用于在事件驱动的GUI中嵌入能够精确控制的任务集成
  • 层次化的可查询的对象树,提供一种自然的方式管理对象关系
  • 智能指针(QPoint),在对象析构之后自动设为0,防止野指针
  • 能够跨越库边界的动态转换机制

 

元对象系统是基于以下3个条件:

(1)基类QObject:任何需要使用元对象系统功能的类必须继承自QObject类

(2)Q_OBJECT宏:必须在类的私有声明区声明Q_OBJECT宏(默认为private)

(3)元对象编译器(Meta-Object Compiler,moc):为QObject子类实现元对象特性提供必要的代码

 

 

二.信号槽

QT编程中信号与槽用于处理界面各个组件的交互,类似与MFC的消息循环和绑定

注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT

 

 信号(Signal)就是在特定情况下被发射的时间,类似于鼠标单击时发生clicked()信号

 

 槽(Slot)是对信号响应的函数

 

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 可以发送信号

 

三.属性

 

转载于:https://www.cnblogs.com/k5bg/p/11081243.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值