• 24595阅读
  • 12回复

如何同时继承两个QObject? [复制链接]

上一主题 下一主题
离线water_wf
 

只看楼主 倒序阅读 楼主  发表于: 2008-09-27
— 本帖被 XChinux 执行加亮操作(2008-09-28) —
困扰好久,我发现如果自己的class同时继承QOjbect 和QWidget,编译是没有问题的,但是如果调用connect 函数就会报编译错误,如何避免这种情况,就是说我有一个自己写的公共的基类继承于QOjbect,里面有大量signal 和slot 同时子类还有继承各个widget,connect时出问题?有人直达怎么处理吗?
离线vlolv

只看该作者 1楼 发表于: 2008-09-27
编译442中。。。。我没实践。。。。
QWidget不是已经继承QObject么,你为什么还要继承QObject?
用QObject::connect如何?
离线water_wf

只看该作者 2楼 发表于: 2008-09-28
我主要想基类定义很多公共的signal和slot,QObject::connect也不行
离线wvins
只看该作者 3楼 发表于: 2008-09-28
非要这么多继承的话,可以看看C++的虚继承。
class A: public A, public virtual B
具体细节不记得了,不过也很少有人会用这么晦涩的语法吧


不建议这么使用多继承,
多继承本来就是C++的一个不太好的特性。

非要使用的话,也是类似接口的方式,
即一个实体类和一个虚类(在C++中可以使用虚类来模拟接口)
--------
接口说白了就是调用约束。
按面向对象的思想来说,组合优于继承。
只是大部分人认为继承了,虚函数了,就是面向对象了。
--------
面向对象部分,可以看看 设计模式,相关书籍很多,不一定要四人帮的了
[ 此贴被wvins在2008-09-28 08:14重新编辑 ]
离线XChinux

只看该作者 4楼 发表于: 2008-09-28
可以试一下将你的所谓加了许多signal/slot的QObject类改为写个模板类,在模板类中定义或连接这些signal/slot.
然后再从此模板类继承。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lazybone
只看该作者 5楼 发表于: 2008-09-28
Jambi
------------
java 只能但继承,可以用接口代替实现
离线water_wf

只看该作者 6楼 发表于: 2008-09-28
我试试
离线XChinux

只看该作者 7楼 发表于: 2008-09-28
引用第4楼XChinux于2008-09-28 08:54发表的  :
可以试一下将你的所谓加了许多signal/slot的QObject类改为写个模板类,在模板类中定义或连接这些signal/slot.
然后再从此模板类继承。


先前试验了一下,signal模板中通不过,弄起来太麻烦了。还是用接口吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线wvins
只看该作者 8楼 发表于: 2008-09-28

模板~
我琢磨着这词咋这么熟悉呢
-------
哎~
模板,泛型离我远已~
-------
不知道有几个人在实际开发中使用泛型的?
使用STL等模板类不算
离线water_wf

只看该作者 9楼 发表于: 2008-09-28
问题的根本原因在于我觉得connect为一个static 成员(如果不是可以通过::来解决),c++的开发者对这种情况有描述,似乎解决起来很麻烦,还是换个办法吧,预祝各位节日快乐
离线water_wf

只看该作者 10楼 发表于: 2008-09-28
引用第8楼wvins于2008-09-28 10:20发表的  :
[表情]
模板~
我琢磨着这词咋这么熟悉呢
-------
哎~
.......

其他地方不知道,但是作游戏开发的经常有这个,unreal的engine里面都是
离线vance
只看该作者 11楼 发表于: 2010-09-29
楼主的问题我也遇到了,
我选择了规避的方法,
信号槽不外乎是"通知",
我是自己用观察者模式来解决的。

楼主可以把继承了QObjet后自己写的信号槽,就用普通C++的观察者模式来实现吧。
当我们无法预知某个直接或间接继承自QObject的基类,将来会出现在何种应用场景(一不小心就遇到了楼主的问题),
是使用QT便利的信号槽,还是自己来实现通知,感觉挺纠结的。

还有种思路,将双继承改为一继承一组合,然后通过friend class来处理,只是这种方法太丑陋了。
离线goodbye

只看该作者 12楼 发表于: 2016-08-06
看来只能自己去实现观察者模式了
快速回复
限100 字节
 
上一个 下一个