Qt父类的信号无法在子类中触发吗

dujiakehu 2015-07-26 11:11:15
用QTableWidget的cellEntered(int,int)会触发槽函数,自己写了一个类TableWidget继承QTableWidget,它的cellEntered(int,int)却无法触发槽函数。
Qt父类的信号无法在子类中触发吗,为什么呢?怎样才能触发这个信号
...全文
2370 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Devchenxip 2016-12-27
  • 打赏
  • 举报
回复
引用 12 楼 foxyz 的回复:
从你的代码片段中推测出应该是正常的,你重新clean了,重新qmake,然后再make试试吧。注意一定要请干净了在重新qmake+make
正解!
huangzi666 2015-08-07
  • 打赏
  • 举报
回复
引用 16 楼 hi1993 的回复:
引用 14 楼 huangzi666 的回复:
我想问下你的信号是在哪个类里面emit的?
我的类继承与qt自带的QTableWidget,都已经封装好了,信号肯定是在它内部emit的,不过具体在哪里我不知道,也并不需要知道
我其实想说的是你的connect应该没问题,你说信号没触发槽函数,我是在想也有可能不是信号没触发函数,而是发送信号的语句根本没被调用。也就是说你外部做的事并不能让cellEntered这个信号发送。 还有你槽函数所在的执行线程有没有死循环的其他函数在执行?
dujiakehu 2015-08-07
  • 打赏
  • 举报
回复
刚刚新建了一个工程做了测试,结果是没有问题的,可以触发,但是我原来那个不知道为什么就是不可以。。。那个项目已经结束了,也不想再去研究了
dujiakehu 2015-08-07
  • 打赏
  • 举报
回复
引用 15 楼 u011330815 的回复:
如果 B类是A类的一个对象,不管是B发送信号触发A还是A发送信号触发B 失败的原因主要有以下两点: 1.信号和槽函数不匹配 2.connect连接写的位置不对(connect应该写在A类中,写在B类中则无法触发)
不是很理解你如果后面那句话的意思 还有connect在哪写都是可以的,只要它能被执行到,执行的时候两个类的指针都已经被实例化了,而且需要信号发射的时候两个类都没有被delete掉就可以了
dujiakehu 2015-08-07
  • 打赏
  • 举报
回复
引用 14 楼 huangzi666 的回复:
我想问下你的信号是在哪个类里面emit的?
我的类继承与qt自带的QTableWidget,都已经封装好了,信号肯定是在它内部emit的,不过具体在哪里我不知道,也并不需要知道
你的OPPA 2015-08-07
  • 打赏
  • 举报
回复
如果 B类是A类的一个对象,不管是B发送信号触发A还是A发送信号触发B 失败的原因主要有以下两点: 1.信号和槽函数不匹配 2.connect连接写的位置不对(connect应该写在A类中,写在B类中则无法触发)
你的OPPA 2015-08-07
  • 打赏
  • 举报
回复
引用 17 楼 hi1993 的回复:
[quote=引用 15 楼 u011330815 的回复:] 如果 B类是A类的一个对象,不管是B发送信号触发A还是A发送信号触发B 失败的原因主要有以下两点: 1.信号和槽函数不匹配 2.connect连接写的位置不对(connect应该写在A类中,写在B类中则无法触发)
不是很理解你如果后面那句话的意思 还有connect在哪写都是可以的,只要它能被执行到,执行的时候两个类的指针都已经被实例化了,而且需要信号发射的时候两个类都没有被delete掉就可以了[/quote] 具体原因不是很清楚,反正我是遇到过这样的问题的
huangzi666 2015-08-06
  • 打赏
  • 举报
回复
我想问下你的信号是在哪个类里面emit的?
jiandan26 2015-07-30
  • 打赏
  • 举报
回复
我也在学习这个问题
dujiakehu 2015-07-29
  • 打赏
  • 举报
回复
引用 10 楼 firebolt2002 的回复:
你这个celEntered应该是个slot函数,你在那里定义的啊。

在FileManageWidget类里,TableWidget的指针是FileManageWidget的私有变量,其实例化在FileManageWisget的构造函数,connect操作也在构造函数里,并且是在实例化后面
donwmufromdying 2015-07-29
  • 打赏
  • 举报
回复
从你的代码片段中推测出应该是正常的,你重新clean了,重新qmake,然后再make试试吧。注意一定要请干净了在重新qmake+make
firebolt2002 2015-07-28
  • 打赏
  • 举报
回复
你这个celEntered应该是个slot函数,你在那里定义的啊。
dujiakehu 2015-07-27
  • 打赏
  • 举报
回复
引用 8 楼 weiweiqiao 的回复:
你把code贴出来吧。从你这里看没什么问题。 另:你的TableWidget继承的那个类??里面有cellEntered??? 不知道signal能否virtual,控制台提示你把cellEntered重复定义了。。
继承QTableWidget。。。这是Qt自带的类,类似c#的DataGridView,是个表格控件,有cellEntered信号,作用是当鼠标进入某一个单元格时发出带有单元格行列号的信号。。英文我也看得懂。。。
  • 打赏
  • 举报
回复
你把code贴出来吧。从你这里看没什么问题。 另:你的TableWidget继承的那个类??里面有cellEntered??? 不知道signal能否virtual,控制台提示你把cellEntered重复定义了。。
水军总督 2015-07-27
  • 打赏
  • 举报
回复
既然是继承,那就什么东西都继承了,包括信号和槽函数
dujiakehu 2015-07-27
  • 打赏
  • 举报
回复
引用 6 楼 weiweiqiao 的回复:
TableWidget中没见cellEntered,只在你的类定义中见了rowEntered么。。
从父类中继承过来的还要再定义吗? 加上定义后也没用,
#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H

#include <QTableWidget>
#include <QDebug>
#include <QMouseEvent>

class TableWidget : public QTableWidget
{
    Q_OBJECT
public:
    explicit TableWidget(QWidget *parent = 0);
    ~TableWidget();

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void leaveEvent(QEvent *event);

private:
    int row = -1;

signals:
    void rowEntered(int row);
    void cellEntered(int row,int column);
};

#endif // TABLEWIDGET_H
而且连接的时候控制台提示 QMetaObject::indexOfSignal: signal cellEntered(int,int) from QTableWidget redefined in TableWidget
  • 打赏
  • 举报
回复
TableWidget中没见cellEntered,只在你的类定义中见了rowEntered么。。
dujiakehu 2015-07-27
  • 打赏
  • 举报
回复
这是我定义的类

在另一个类里面定义了一个它的私有指针
在这个类的构造函数里实例化了,并且connect,
打印的结果是true,this的cellEntered函数是这样的
但是什么输出都没有,这样做哪里出问题了吗?
foruok 2015-07-27
  • 打赏
  • 举报
回复
信号是可以继承的,触发没问题。仔细查下你的代码。
donwmufromdying 2015-07-27
  • 打赏
  • 举报
回复
无代码只能乱猜了,你的错误有一下几个可能:你自己添加的类有Q_OBJECT宏吗?当然这个缺少应该不影响你父类的信号。 2、具体的连接函数的使用正确吗?比如:信号和槽的参数匹配问题,比如:对象指针问题。
加载更多回复(1)

21,499

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧