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

dujiakehu 2015-07-26 11:11:15
用QTableWidget的cellEntered(int,int)会触发槽函数,自己写了一个类TableWidget继承QTableWidget,它的cellEntered(int,int)却无法触发槽函数。
Qt父类的信号无法在子类中触发吗,为什么呢?怎样才能触发这个信号
...全文
2064 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)
9.1事件机制与原理分析 9.1.1 什么是Qt事件驱动?         我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 有点抽象,Qt进行了封装        实际上a.exec()便是Qt程序进入事件消息循环, 9.1.2 图形界面应用程序的消息处理模型 回调、os的魔抓windows、linux,从用户层到 内核层,如何管理进程、线程、 Os如何处理、底层机制 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的  系统内核的消息通过事件处理转变成QT信号 9.1.3 Qt的事件处理 (1)在Qt,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.              事件处理的核心包括事件①产生、②分发、③接受和处理 ①事件的产生 谁来产生事件? 最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent, mousePressEvent,mouseReleaseEvent事件 (被封装成QMouseEvent和QKeyEvent)。 ②Qt事件的分发 谁来负责分发事件? 对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.  对于Qt GUI程序,由QApplication来负责   ③事件的接受和处理 谁来接受和处理事件? 答案是QObject。 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责( 内存管理、内省intropection、事件处理制)之一。 任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。 9.1.4 QObject的内省机制

16,212

社区成员

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

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