`

Qt的元对象系统

    博客分类:
  • Qt
阅读更多
元对象系统:创建了独立的软件组织,这些组件可以绑定在一起,但任何一个组件对于它所要连接的组件的情况事先都一无所知。
1.信号-槽
槽:和普通成员函数一样,可以是虚函数,可以被重载,可以是public,private,protected,并且可以被其它成员函数调用。唯一不同的是槽可以和信号连接,每当emit一个信号就会自动调用这个槽函数
emit:Qt中的关键字,像其它Qt扩展一样,它也会被c++预处理器转换成标准的c++代码
一般情况下信号和槽的必须有相同的顺序和相同的类型。

内省:对于实现信号和槽是必须的,并且允许应用程序的开发人员在运行时获得有关QObject子类的元信息,包括一个含有对象的类名以及它所支持的信号和槽的列表。

Qt通过提供一个独立的moc工具来解析O_OBJECT类的定义,由于moc使用纯C++来实现它的所有功能,所以Qt的元对象系统可以在任意C++编译器上工作。
1.Q_OBJECT宏声明了在每一个QObject子类中必须实现的一些内省函数:metaObject(),tr(),qt_metacall()...
2.moc工具生成了用于Q_OBJECT声明的所有函数和所有信号的实现
3.像connect()和disconnect()这样的OBject的成员函数使用这些内省函数来完成它们的工作。

findDialog.h
#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include<QDialog>

class QLabel;
class QHBoxLayout;
class QLineEdit;
class QVBoxLayout;
class QRadioButton;
class QCheckBox;
class QPushButton;

class FindDialog:public QDialog{
    Q_OBJECT
public:
    explicit FindDialog(QWidget *parent=0);
private:
    QLabel* label1;
    QLineEdit* lineEdit;
    QHBoxLayout* layout;
    QHBoxLayout* layout1;
    QVBoxLayout* layout2;
    QVBoxLayout* layout3;
    QVBoxLayout* layout4;
    QRadioButton* radioButton;
    QCheckBox*  checkBox;
    QPushButton* findButton;
    QPushButton* closeButton;
protected slots:
    void clearText(QString s);
    void findSlots(const QString& s);
    void responseClick();
signals:
    void findSignals(const QString& s);
};

#endif // FINDDIALOG_H



findDialog.cpp
#include"FindDialog.h"
#include<QApplication>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QLabel>
#include<QLineEdit>
#include<QRadioButton>
#include<QCheckBox>
#include<QPushButton>
#include<QMessageBox>

static const QString lineStr = "write...";

FindDialog::FindDialog(QWidget *parent)
    :QDialog(parent)
{
    label1 = new QLabel("Find What:");
    layout = new QHBoxLayout;
    layout1 = new QHBoxLayout;
    layout2 = new QVBoxLayout;
    layout3 = new QVBoxLayout;
    layout4 = new QVBoxLayout;
    lineEdit = new QLineEdit;
    lineEdit->setText(lineStr);
    radioButton = new QRadioButton("Match case");
    radioButton->setChecked(true);
    checkBox = new QCheckBox("Search backward");
    checkBox->setChecked(true);
    findButton = new QPushButton("Find");
    closeButton = new QPushButton("Close");

    layout1->addWidget(label1);
    layout1->addWidget(lineEdit);

    layout2->addWidget(radioButton);
    layout2->addWidget(checkBox);

    layout3->addLayout(layout1);
    layout3->addLayout(layout2);

    layout4->addWidget(findButton);
    layout4->addWidget(closeButton);

    layout->addLayout(layout3);
    layout->addLayout(layout4);

    setLayout(layout);
    setWindowTitle("Find");
    sizeHint();
    connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
    connect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(clearText(QString)));
    connect(findButton,SIGNAL(clicked()),this,SLOT(responseClick()));
    connect(this,SIGNAL(findSignals(const QString&)),this,SLOT(findSlots(const QString&)));
}

//当第一次编辑lineEdit时把原来的write...去掉,并解除这对信号-槽
void FindDialog::clearText(QString s)
{
    s.remove(lineStr);
    lineEdit->clear();
    disconnect(lineEdit,SIGNAL(textEdited(QString)),this,SLOT(clearText(QString)));
    lineEdit->setText(s);
}

//响应点击,发出不同的信号
void FindDialog::responseClick()
{
    if(radioButton->isChecked()||checkBox->isChecked()){
        emit findSignals("checked");
    }else{
        emit findSignals("not checked");
    }
}

void FindDialog::findSlots(const QString &s)
{
    QMessageBox* msg = new QMessageBox(QMessageBox::Information,
                                       "Message",
                                       s);
    msg->exec();
}

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    FindDialog* dialog = new FindDialog;
    dialog->show();
    app.exec();
}






  • 大小: 65 KB
分享到:
评论

相关推荐

    Qt核心机制、Qt元对象系统、Qt信号槽原理

    这就引出了 Qt 的元对象系统。元对象系统是 Qt 为了解决 C++ 静态类型的限制而设计的一种机制,它允许在运行时动态地添加和修改对象的属性,以及实现对象之间的通信。 1. **元对象系统**: - Qt 的元对象系统基于 ...

    利用Qt元对象系统实现jsonrpc服务端(与Go客户端进行远程调用测试).zip

    QT,C++使用技巧,实战应用开发小系统参考资料,源码参考。 详细介绍了一些Qt框架的各种功能和模块,以及如何使用Qt进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者,能够帮助你快速上手Qt...

    Qt元对象和属性系统详解.pdf

    总结起来,Qt元对象系统和属性系统是Qt框架的关键特性,它们极大地增强了C++的面向对象编程能力,使得跨平台应用开发更加便捷高效。元对象系统提供的信号与槽机制解决了对象间的通信问题,而属性系统则允许动态地...

    Qt元对象特性测试用例

    测试用例samp3-1演示Qt元对象系统的一些功能。

    Qt3.1.3元对象特性测试实例对应的代码实现类person的对象年龄的增长

    在Qt框架中,元对象系统(Meta-Object System)是一个强大的特性,它使得C++类可以与Qt的信号和槽机制、属性系统以及动态对象功能紧密集成。在Qt3.1.3版本中,元对象特性是核心组件之一,允许程序员以更灵活的方式...

    qt-C++开发例子3-演示了元对象的用法

    元对象系统是Qt库中的一个重要特性,它为C++引入了许多面向对象编程中的高级功能,如信号与槽机制、运行时类型信息以及动态属性系统。在“qt-C++开发例子3”中,我们将深入探讨元对象系统在实际应用中的体现。 首先...

    A Little Thinking in Qt

    ### Qt中的元对象系统(Meta-Object System) 在探讨Qt框架的核心特性时,我们不可避免地会接触到其元对象系统(Meta-Object System)。这一系统是Qt框架中极为关键的组成部分,它不仅支持了Qt的信号与槽机制,还提供...

    Qt原对象系统分析总结

    元对象系统是Qt框架的核心部分,它使得C++对象能够支持动态属性、信号与槽机制,以及其他元数据相关的功能。本文将深入分析Qt的元对象系统,并探讨其关键组件。 首先,`QObject`类是元对象系统的基础,它是所有利用...

    QtQ_OBJECT.7z

    标题中的"QtQ_OBJECT"提到了一个关键概念,这与Qt库中的元对象系统(Meta-Object System)紧密相关。下面将详细介绍这个知识点及其相关背景。 Qt的元对象系统是其框架的一个核心特性,它允许开发者在运行时动态地...

    Qt_ObjectFactory.zip

    Qt的元对象系统是其反射能力的基础,它由 moc(Meta-Object Compiler)工具生成的元对象代码提供支持。moc会扫描Qt类的头文件,为每个类生成元对象代码,包含了类的元信息。这些信息存储在QMetaObject类的实例中,...

    qt 对象树简介

    这些资源可以帮助深入理解Qt对象树的使用和实现细节,包括但不限于如何创建和管理对象树、如何利用对象树进行事件分发、如何利用信号与槽机制在对象间通信、以及如何利用`QObject`的动态属性系统等。 总的来说,...

    qt通过类名动态创建对象

    首先,我们需要了解Qt的元对象系统(Meta-Object System)。这个系统是Qt框架的一个核心特性,它为C++语言提供了运行时类型信息、信号与槽机制以及动态属性系统。元对象系统的关键组件是`QMetaObject`类,它存储了...

    基于QT的电子画板功能的实现 (2).doc

    元对象系统使得QT对象之间可以进行交互和通信,从而实现复杂的应用程序。 6. QT Creator设计软件概述 QT Creator是QT框架提供的一个集成开发环境(IDE),提供了一个完整的开发环境,包括项目管理、代码编写、调试...

    qt工具加源码

    1. **QT库**:QT库是QT的核心,其中的Q_OBJECT宏是QT元对象系统的基础,它使得C++对象可以支持信号与槽机制,这是QT的一大特色,允许对象间的异步通信。此外,还有QWidget类,它是所有GUI部件的基础,包括QLabel、...

    QT 自助点餐系统

    综上所述,QT自助点餐系统结合了QT库的强大功能和面向对象编程的优势,构建了一个全面的餐饮服务应用。其设计和实现涵盖了图形界面设计、数据管理、网络通信、安全性等多个方面,是学习和实践QT开发的优秀实例。通过...

    QT6实战-QML与C++联合编程教程

    由于QML引擎与Qt元对象系统的集成,可以从QML中访问任何从QObject继承的类的属性、方法和信号,C++代码既可以在应用中集成,也可以在插件中集成。 QML访问C++数据主要有三种方法: 1、将C++ 类的属性暴露给QML; 2、...

    qt 源码 船只博客

    4. **Q_OBJECT宏**:这是Qt元对象系统的关键,允许对象定义信号、槽和属性,支持动态方法调用和反射。 5. **丰富的控件库**:Qt提供大量预定义的GUI组件,如按钮、表格、对话框等,可以快速构建复杂的用户界面。 6. ...

    Qt remote objects 简单跨进程读写文件示例

    这种技术基于Qt的元对象系统(Meta-Object System),它使得类型安全的远程方法调用成为可能。 在本示例中,我们有至少两个进程:一个是服务器进程,提供文件写入功能;另一个是客户端进程,负责调用服务器上的方法...

    精通qt4编程(源代码)

    较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统和对象树机制,以及部件类型和部件的几何布局等内容。 35 \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由多...

    Qt

    总的来说,`Q_DECLARE_METATYPE`和`qRegisterMetaType`使得自定义类型能够在Qt的元对象系统中被识别,这样它们就能无缝地与`QVariant`、信号和槽以及其他依赖于元对象系统功能的组件一起工作,极大地提高了代码的...

Global site tag (gtag.js) - Google Analytics