• 6176阅读
  • 5回复

Qt的元对象系统怎么绑定组件? [复制链接]

上一主题 下一主题
离线yshadow
 

只看楼主 倒序阅读 楼主  发表于: 2008-04-17
— 本帖被 XChinux 从 论坛公告栏 移动到本区(2008-04-21) —
关键词: 架构
  Qt的元对象系统我看了下程序设计指南,只大体介绍了一下,没有细分。
1 怎么样建立独立软件组件?
2 怎样用Q_OBJECT类定义可生成C++标准函数?步骤
3 moc怎么把Qt程序生成C++代码?
4 关于国际化""引号里的东西,是怎么转化为国际化?

 请有了解或深研的支持一下,致谢!
[ 此贴被XChinux在2008-07-18 07:53重新编辑 ]
离线owenbbkp

只看该作者 1楼 发表于: 2008-04-18
几句话是说不清楚的,自己看Qt源代码吧,这样印象最为深刻。也没有多少文档可以参考,Qt的官方文档是不会介绍它的内部实现机制的。

下面这本书里介绍了一部分实现机制:
ARM嵌入式Linux系统开发从入门到精通 http://www.china-pub.com/35771
11.2 Qt对象模型
11.2.1 元对象系统
11.2.2 信号和槽机制的实现
11.2.3 元对象编译器moc

等有时间我总结一下给大家参考
离线yshadow

只看该作者 2楼 发表于: 2008-04-21


我会细读其中的章节
离线yshadow

只看该作者 3楼 发表于: 2008-04-22
>>>>>>>>>>>>>>>>>>>>>>找了一些相关的信号与槽,转接过来,供大家分享>>>>>>>>>>>>>>>>>>>>>>
QT是一个跨平台的C++GUI应用构架,窗口部件集,面向对象,易扩展,真正的组件编程特点。
Linux最为流行的KDE桌面环境,

信号和槽机制是QT的核心机制,要精通Qt编程必须对信号和槽有所了解。

是一个高级接口,应用于对象之间有通信,Qt的核心特性。

要正确的处理信号和槽,必须借助一个称为 Moc Meta object Compiler 的QT工具。它为高层次的事
件处理自动生成所需要的附加代码。

窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,
这个回调函数----》函数  的指针。


所有从QObject 或其子类派生的类都能饮食信号和槽。当对象改变其状态时,信号就由对象发射emit出去

信号:

当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及
其派生类能够发射这个信号,当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用
一样,
信号与槽完全独立于任何GUI事件循环,只有当所有的槽返回以后发射函数(emit)才返回,

信号的声明是头文件里进行的,QT的Signals关键字指出进入了信号声明区,随后即可声明自己的信号
  example ::
 
      signals :
          void mySignal();
          void mySignal(int x);
          void mySignal(int x,int y);
         
          注:1.  信号的返回类型都是void,
                   2.  信号返回类型都是void
                   3.  声明信号形式上和普通C++函数一样,没有函数体定义。
离线yshadow

只看该作者 4楼 发表于: 2008-04-22
槽:
槽是C++普通函数罢了,它的不同点是,与信号相关联,当它的信号被发射时,这个槽会就自动调用。
槽可有参数,但不可有缺省值。分成的种类为:public slots ,private slots ,protected slots
  public slots :
      void mySlot();
      void mySlot(int x);
      void mySlot(int x,int y);
  信号与槽的关联:
      connect(sender,SIGNAL(),receiver,SLOT());
  当信号与槽没有必要继续保持关联时,可以用diconnect()函数断开连接。
         disconnect(sender,SIGNAL(),receiver,SLOT());
  断开关联三种情况
      1.断开与某个对象相关联的任何对象、
          disconnect(myObject,0,0,0) or myObject->disconnect();
      2. 断开与某个特定信号的任何关联
          disconnect(myObject,SIGNAL(mySignal()),0,0) or myObject->disconnect(SIGNAL(mySignal()))            
      3.断开两对象之间的关联
          disconnect(myObject,0,myReceiver,0) or myObject->disconnect(myReceiver)
离线yshadow

只看该作者 5楼 发表于: 2008-04-22
  注意:
 
1.信号与槽的效率比较高,虽然的折损,但比起简洁、灵活性是取其利的
2.可能产生或者容易产生死循环,或间接死循环。
3.信号的被发射时,与之相关的槽被调用的顺序是随机的。
4.宏定义不能用在SIGNAL and SLOT中充当参数。
5.类的构造函数不可在用SIGNALS and SLOTS声明区域内
6.函数指针不能作为信号或槽的参数
7.信号与槽不能缺省参数
8.信号与槽不能携带模板类参数
9.嵌套的类不能位于信号或槽区域内,不能有信号或槽
10.友元声明不能位于信号或槽声明区内
快速回复
限100 字节
 
上一个 下一个