• 11491阅读
  • 17回复

QT的,这是什么问题?关于信号槽的! [复制链接]

上一主题 下一主题
离线lugaideath
 

只看楼主 倒序阅读 楼主  发表于: 2009-01-07
— 本帖被 XChinux 执行加亮操作(2009-01-08) —
myControl/GraphicsView/graphwidget.cpp: In constructor ‘GraphWidget::GraphWidget(QWidget*)’:
myControl/GraphicsView/graphwidget.cpp:71: 错误:对 ‘GraphWidget::connect(Node*&, const char [11], GraphWidget* const, const char [11])’ 的调用没有匹配的函数
/usr/local/Trolltech/Qt-4.4.3/include/QtCore/qobject.h:197: 附注:备选为: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/usr/local/Trolltech/Qt-4.4.3/include/QtCore/qobject.h:302: 附注:        bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
make: *** [graphwidget.o] 错误 1


出错的是 connect(node1,SIGNAL(aaa(bool)),this,SLOT(bbb(bool)));

node1是我写的一个类,继承QGraphicsItem的,里面写了信号void aaa(const bool &state);
出错的这个类是继承QGraphicsView的,里面写了槽void bbb(bool state);

为什么出现这个错误,晕死了,要怎么解决?
离线evoleci
只看该作者 1楼 发表于: 2009-01-07
建议检查下你的signal和slot函数的名称还有里面的参数类型,
如果signal或slot函数的名称,类型写错了,有可能会出现这个错误
我们只是在经历着一些事情。
离线xjcook

只看该作者 2楼 发表于: 2009-01-07
QGraphicsItem不是从qObject继承下来的,不能添加信号
离线lugaideath

只看该作者 3楼 发表于: 2009-01-07
我同意楼上的答案!我已经在想别的实现方法了!
离线xjcook

只看该作者 4楼 发表于: 2009-01-07
你的最终目的是什么,说说看,
我也在用这些东西,看有没有你需要的。
离线sbtree
只看该作者 5楼 发表于: 2009-01-07
可以采用多继承方式,也就是node1继承QObject和QGraphicsItem
windows 7 + VC++2008 + Qt4.5.2
离线lugaideath

只看该作者 6楼 发表于: 2009-01-08
呵呵!楼上说的我也试过了,但是编译不过,我就发帖问了!

不用信号槽我想不到别的方法解决我的问题了!
离线xjcook

只看该作者 7楼 发表于: 2009-01-08
不推荐使用多继承,因为如果只是为了使用信号和槽,就让QGraphicsItem增加了QObject的开销并不值得,
实际上QGraphicsItem也并没有使用和QObject有关的东西。
如果除了信号和槽没有其他方法可以解决你的问题,你可以定义一个类从QObject继承,用来作为QGraphicsItem
的代理,每个QGraphicsItem中保存一个你的代理类的指针,需要发信号的时候使用那个代理来发,
在你的信号里面来标识是那个QGraphicsItem发送的信号,这样只需要一个QObject的开销就可以了。
离线lugaideath

只看该作者 8楼 发表于: 2009-01-08
楼上的可以提供一个简单的例子来说明一下怎样用QGraphicsItem作为代理吗?
离线lugaideath

只看该作者 9楼 发表于: 2009-01-08
还要说明一下,我主要的是要用到QGraphicsItem的功能,我的类时重写了QGraphicsItem的部分方法的,而且为了实现信号槽所以我才打算继承QObject下来的!
离线xjcook

只看该作者 10楼 发表于: 2009-01-08
你先告诉我你有什么地方是必须使用信号和槽的。
最经常使用的可能就是需要触发刷新,但是在QGraphicsItem里面是可以取得其所在的scene的,
很多地方你只需要直接调用scene的相关函数就可以了。
离线lugaideath

只看该作者 11楼 发表于: 2009-01-08
我在我的QGraphicsItem的鼠标按下和释放两个事件里面发送信号,因为在我的QGraphicsView里面是用循环把我这个类实例化N个QGraphicsItem出来,但因为我给了每个QGraphicsItem都各有其状态,我要通过鼠标事件来获取其状态,如果不用信号槽,我该怎么做呢?

因为要多少个,要怎样的QGraphicsItem不是我写死的,是我的QGraphicsView控制的,所以不用信号槽我不知道怎么取得QGraphicsItem的状态!
离线xjcook

只看该作者 12楼 发表于: 2009-01-08
其一、QGraphicsItem鼠标事件是QGraphicsView给他的,会先被QGraphicsView取得,然后才到QGraphicsItem的,
而你在鼠标按下时是可以取得当前的QGraphicsItem的,也就是说在QGraphicsView里面是完全可以知道现在是
那个QGraphicsItem在处理鼠标事件。

其二、QGraphicsItem应该是你重写了的,还可以用前面我说的方法,先定义一个继承于QObject的类,然后在QGraphicsItem
中定义一个这个类的指针,这个类是用来代替QGraphicsItem发信号的,一开始new一个,然后每次new QGraphicsItem的时候,
把已经实例化了的类指针赋值给QGraphicsItem,在这个类里面可以定义一个函数,用来发射某个信号,在QGraphicsItem需要
发信号的时候调用这个函数,就可以通知你的QGraphicsView了。

其三、我也重写了QGraphicsItem的鼠标事件,还通过鼠标把QGraphicsItem拖的可大可小,还可以通过属性编辑器设置其
各种属性,但是完全可以不使用信号和槽。

另:对于你的需求,我还是没有了解,你是不是可以贴几个图上来看下,你是要实现啥样子的。
离线wd007

只看该作者 13楼 发表于: 2009-01-08
重写鼠标事件,采用楼上的方法,可以不用signal and slot
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线lugaideath

只看该作者 14楼 发表于: 2009-01-09
QGraphicsItem和QGraphicsView的鼠标事件我都有重写的,因为QGraphicsItem和QGraphicsView都有要处理的事。

如果通过QGraphicsView可以取得我QGraphicsItem设置了的状态吗?那状态是我用变量存起来的!

xjcook你说的“其二”是要怎么写呢?例如我定义了myObject *mo,那么是在QGraphicsItem写信号,还是在myObject里面写信号呢?发送又是在哪个类里面发送呢?在我的QGraphicsView里面我写connect的时候,信号那里应该是写myObject的吧!

因为我不太明白,希望可以把重点部分的代码写出来,谢谢!
离线lugaideath

只看该作者 15楼 发表于: 2009-01-09
问题都解决了!谢谢xjcook的提醒,原来一直是自己钻牛角尖了!
离线xjcook

只看该作者 16楼 发表于: 2009-01-09
呵呵,恭喜恭喜
注意结贴,让以后的朋友们有个参考
离线tianykun
只看该作者 17楼 发表于: 2009-06-01
谢谢,我就是看了这个帖子,才是解决问题的
不过记得,那个类,要早点声明,并定义
不然,出现错误都不知道怎么找了
快速回复
限100 字节
 
上一个 下一个