• 9077阅读
  • 9回复

[提问]求助关于信号和槽的问题 [复制链接]

上一主题 下一主题
离线zjhz_wz
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-11
例如如下例子:
class A{
private:
  B b;
};

class B{
private:
  C c;
};

Class C{
public:
signal:
f1(x);
};

Class D{
public:
slot:
f2(x);
};

class main{
A a;
D d;
connect(&(a.b.c),signal(f1(x)),&d,slot(f2(x)));
}
请问如上所示的3层嵌套a.b.c中的C的信号可以直接和d的槽连接不?既connect的写法正确否,望赐教。
离线zooood
只看该作者 1楼 发表于: 2011-03-11
觉得这是可以的,lz还是实验下稳妥
离线duduqq

只看该作者 2楼 发表于: 2011-03-11
干嘛搞得这么复杂呢
离线zjhz_wz

只看该作者 3楼 发表于: 2011-03-11
软件结构就是这么设计的,已经这样做了,但是每次发出信号,槽不能激活
离线roywillow

只看该作者 4楼 发表于: 2011-03-11
D的slots是不是应该写成public slots?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线无冰蚂蚁

只看该作者 5楼 发表于: 2011-03-11
这是全部代码吗,怎么没有 Q_OBJECT 宏啊,如何moc编译的?
不要放弃,答案就在附近。呵呵,默认的正合我意。
离线zjhz_wz

只看该作者 6楼 发表于: 2011-03-11
不是全部代码,就是举个例子,类嵌套时候信号和槽的用法,这样对不对
离线sbtree
只看该作者 7楼 发表于: 2011-03-11
任何类的信号和公有槽都可以通过外部调用connect连接,不在于你如何取得类实例变量的指针。
不过你给的代码错误不少啊:
1.信号和槽要求派生类必须直接或间接继承QObject,并且 必须声明中要加入宏Q_OBJECT
2. A,B中的成员变量b,c在私有区,编译的时候就应该出错了
3. 信号的声明使用关键字signals,不是signal,少写了一个s
4. main函数返回值不能用class

评语:提问题也要严谨点
windows 7 + VC++2008 + Qt4.5.2
离线coblan

只看该作者 8楼 发表于: 2011-03-12
Re:获取QT窗口句柄
这个了解原理了,其实很简单,万变不离其宗。。RTTI ,支持。。如同<<深入浅出>>MFC 中讲的那样,你可以这样来理解objet 这个类:
这个类,我们分为普通部分和辅助部分,普通部分就不说了。辅助部分是用作辅助作用,包括了很多信息,如类的名字、类的构造函数的指针等等(C++是编译语言,运行时是没有类名的,只有类的指针类型)。为了程序的更加强大,所以加入了一些专门用来保存类信息的部分。我想QT中的 metaobjet也应该是这种东东。不仅如此,还在你的程序中建立了一个 以object为顶点的类似树形的所有object子类的结构图。这样实现qobject_cast这样的功能就很简单了,不仅如此整个程序中只要是object的子类,都能找到其各种信息。具体的请看书。
同样QT中的 signal和 slot 机制,我想也应该是记录在metaobject之类的东东中,或者就记录在我上面提到的那个类关系网中。。这就很好理解了,假如每个signal有一个函数指针数组,只要signal发生了,就调用该数组中的函数。这一切在object引导的类关系网下,显得很简单了。。MFC中这个关系网是个链表,叫什么名字忘记了。
辅助部分可能你需要也可能不需要,所以定义了宏"Q_OBJECT" 来实现辅助部分的功能。在MFC中这种类型的宏一般都是 申明部分(在h文件中) ,实现部分(在app文件中)。在QT中,这种宏好像必须放在h文件中,moc编译器才会去编译这种宏。。
综上,关键就在于 以object为首的类的关系网的功能。。呵呵。
//我不是学计算机的,以上不严谨,说错无怪
离线dbzhang800

只看该作者 9楼 发表于: 2011-03-12
引用第7楼sbtree于2011-03-11 17:26发表的  :
任何类的信号和公有槽都可以通过外部调用connect连接,不在于你如何取得类实例变量的指针。
不过你给的代码错误不少啊:
1.信号和槽要求派生类必须直接或间接继承QObject,并且 必须声明中要加入宏Q_OBJECT
2. A,B中的成员变量b,c在私有区,编译的时候就应该出错了
3. 信号的声明使用关键字signals,不是signal,少写了一个s
4. main函数返回值不能用class
评语:提问题也要严谨点
.......


同意
快速回复
限100 字节
 
上一个 下一个