转载自:https://blog.csdn.net/luolaihua2018/article/details/110388411

信号槽失效的原因
用Qt进行信号与信号槽连接后,会出现信号槽不响应信号的情况,原因可能是以下的情况:

1、类没有声明Q_OBJECT;
2、信号槽没有定义为pubic/protected/private slots;
3、事件被子控件过滤掉了。比如QListWidget,当QListWidgetItem已经处理keypress事件后,QListWidget就不能响应itemDoubleClicked事件了。
4、信号槽的参数是自定义的,这时需要用qRegisterMetaType注册一下这种类型。具体操作可搜索 qRegisterMetaType的使用。

信号槽的两种关联方式

QPushButton *btn = new QPushButton;
    // 方式一:老式写法
    connect(btn, SIGNAL(clicked()), this, SLOT(close()));
    // 方式二:Qt5后新写法
    connect(btn, &QPushButton::clicked, this, &MainWindow::close);
    // 方式三:lambda表达式
    connect(btn, &QPushButton::clicked, this, [&]() {
        this->close();
    });

方式一 老式写法,在编译的时候即使信号或槽不存在也不会报错,但是在执行的时候无效,对于C++这种静态语言来说,这是不友好的,不利于调试;

方式二 Qt5后推荐的写法,如果编译的时候信号或槽不存在是无法编译通过的,相当于编译时检查,不容易出错,还有就是槽的写法可以直接写在public控制域下,不一定非要写在public slots:控制域下;

方式三 采用了lambda表达式的写法,更加方便快捷。

注意事项:

方式一的槽函数要写在 public slots: 控制域下
方式二在Qt5中是可以传入信号和槽的“函数指针”的,通俗一点就是可以直接将“函数名”作为参数传进去,正是因为这一点,在写“槽”的时候就需要注意到public、protected和private的问题。
在以前的Qt4中,“信号和槽”是通过SIGNAL()和SLOT()的方式来连接的,现在可以使用“函数名”的方式来连接,就需要考虑到“函数名”是否有效 ,
在将“槽”声明为protected和private的时候,在类外是不能直接通过对象来访问到该函数的,即:在类外使用connect并传入“函数名”时,将会编译不通过,此时需要将protected、private更改为public即可。

//在myButton.h中新建一个protected函数
protected:
    void test(){
        qDebug() << "myButton";
//在mainwidget.cpp中创建对象并调用,
 myButton *btn =new myButton;
 connect (rotateSlider,&QSlider::valueChanged ,btn,&myButton::test );
mainwidget.cpp:84:68: error: 'test' is a protected member of 'myButton'
mybutton.h:13:10: note: declared protected here

解决办法:

若test()函数类型为public则不报错。
使用老式的连接方式:

 connect (rotateSlider,SIGNAL (valueChanged(int)),btn,SLOT(test()));

不过要注意test()函数要声明为protected slots:

protected slots:
    void test(){
        qDebug() << "myButton";
                    方式二 Qt5后推荐的写法,如果编译的时候信号或槽不存在是无法编译通过的,相当于编译时检查,不容易出错,还有就是槽的写法可以直接写在public控制域下,不一定非要写在public slots:控制域下;在以前的Qt4中,“信号和槽”是通过SIGNAL()和SLOT()的方式来连接的,现在可以使用“函数名”的方式来连接,就需要考虑到“函数名”是否有效 ,方式一 老式写法,在编译的时候即使信号或槽不存在也不会报错,但是在执行的时候无效,对于C++这种静态语言来说,这是不友好的,不利于调试;
这里面,发送了sigJumpu信号后,触发不了onTestJump,原因就是我应该把connect写在最前面,如下图:
这样就会触发了,顺序很重要,这种小细节不注意的话。找原因要找死人啊,看似简单,其实很重要。
下面记录下网上一些比较大众的原因:(括号内是我的注解)
1)函数未声明为 slots 类型, 信号函数...
但是函数执行完毕之前好像是不会刷新画面的. 
经过度娘的告知,找到了以下网址: 
https://jingyan.baidu.com/article/d5a880eb6d5f7f13f147ccff.html 
完美地解决了问题. 
防止网址内容日后丢失,因此拷贝出来:
为什么不会刷新界面呢,这是由于调用show函...
				
下面程序编译没有错误,运行却未达到想要的效果,最后调试发现,是信号绑定后无效,即函数没有受到信号的触发。具体代码如下: main.cpp #include <QtCore> #include "controller.h" #include "mythread.h" int main(int argc,char*argv[]) QCoreApplication app(argc,argv); Controller controler; controler.sta
信号无法触发的原因,无非就就下面几种: 1.忘记连接信号,这种错误十分低级,排查难度一颗星; 2.信号使用了自定义参数(此处应该注意自定义参数是包括数组的,本人在此处吃过一次亏,浪费了半天时间排查),但是没有注册过,应该在开头使用qRegisterMetaType<Mytype>("Mytype");注册,排查难度两颗星; 3.实际运行的线程资源被占用,或者是所在的对象正在其他的响应过程,这个问题需要带调试排查,排查难度三颗星。 第3点在线程架构设计的时候就需要考虑到这个问题,尽
Qt信号连接失败原因主要有以下几点: 1.函数并没有声明在类的public slots(或private slots或protected slots)里,因此,所想要成为函数的那个函数只是普普通通成员函数。 2.信号之间存在参数传递,但是二者的参数数量或者类型不一致(信号里的参数数量可以多于函数里的参数数量,但是二者都有的参数,类型必须对应); 3.信号之间有参数传递,但是使用connect的时候在函数或者信号或者二者同时加入了形参,比如下面的两个connect,第一个连接因为有形参,不
今天遇到emit信号后,一直没有响应 我的信号定义是void recv(std::string)跟他一样,接收数据,connect检查,qthread qobject都检查没有问题,但就是没有响应 分析得到: 信号传递的参数需要是常规的,所以我将信号定义为void recv(QString),然后消息正常接收,记录一下这个低级错误
QT信号机制浅析Qt信号机制是Qt的一大特点,实际上这是和MFC的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一个函数触发另一个类的另一个函数调用,而且还要把相关的参数传递过去.好像这和回调函数也有点关系,但是消息机制可比回调函数有用
Qt QTcpSocket 类提供了一个连接失败的信号 readyRead()。当连接尝试失败时,该信号会被 QtcpSocket 发射。你可以使用以下代码连接该信号: ```cpp connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); 其,socket 是你创建的 QTcpSocket 实例,error 是 QTcpSocket 的一个错误信号,displayError 是你自定义的函数,用于处理错误信息。在该函数,你可以使用 QAbstractSocket::errorString() 方法获取错误信息。 ```cpp void MyClass::displayError(QAbstractSocket::SocketError socketError) qDebug() << "Error: " << socket->errorString(); 以上代码会在连接失败时打印错误信息。
catia二次开发:冒号连接,一行的if不用endif,模态,load,unload,option explicit,多窗口,递归调用,sendkey, 枚举,代码加行,设置轴系,可选函参,占位符 liyuxi0816: 老师很厉害 Catia VBA二次开发:宏的录制,精简,改编,回放 janus560: 可以进去了 但是做重复的时候 报错了 Catia VBA二次开发:宏的录制,精简,改编,回放 janus560: 请问这个编辑页面怎么打开? 为什么我无法把新建好的宏程序用这个打开? vba数据类型,运算符,内置函数,循环判断语句,窗体控件 初学c++: 写的太棒了,很详细,有感受到作者花了很多精力 点赞收藏 catia 二次开发:获得投影视图 catia_vb: 煮酒 请教一个问题 代码中的定义主视图是理想状态中的主视图 ; 如果需要的是选择某个零件上的面作为主视图方向 这怎么处理?