QT 信号 槽函数 图文笔记

信号和槽函数看来不是那么好理解,只熟悉MFC框架的我更是看不懂信号槽。所以整了个服务器的QT程序,用这个场景来研究信号槽函数。

服务器,窗口类mainwindow 服务器监听类server 每个连接产生socket类Tcpclientsocket
在这里插入图片描述
发现原则1:这个类需要声明实现 自己的槽函数 不需要声明要接的信号 而要声明要发给别的类的信号
发现原则2:这个类需要#include进 要给它自己发信号的类的头文件
发现原则3:这个类头文件需要声明一个,它#include进的要给它自己发信号的类的指针,或者不包含给信号的类指针 局部new

Tcpclientsocket *tcpClientSocket = new Tcpclientsocket(this);

发现原则4:要发给谁,不需要引入这个目标类的头文件。要从别处接,就得引入那个给信号类的头文件,因为在写connect时候得用
发现原则5:本类下 connect绑定的都是别的类发给自己的信号,和自己定义的槽函数 不能绑别的类的槽函数 废话
发现原则6:与基类信号connect 发出方参数都是this,最下层那个类 Tcpclientsocket connect的信号都是 QTcpSocket(基类)自带信号

Tcpclientsocket的

    connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived()));
    connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));

发现原则7:如果有个信号,和自己发给别的类的信号名字相同 也是可以的
Tcpclientsocket 接 基类给的信号disconnected 自己也给server发 void disconnected(int);
发现原则8:在一个类的头文件里,ctrl+鼠标左键信号,不会跳转,因为信号都是发出给别人的,看看此类头文件#inlcude包含的头文件,那个就是信号来源
发现原则9:有些槽函数是基类的虚函数,需要实现,在头文件里一般写到protected:下
server的

protected:
	void incomingConnection(int socketDescriptor);

是QTcpServer的

protected:
	virtual void incomingConnection(qintptr handle);

基类QTcpSocket里 下就没有protected的虚函数
Tcpclientsocket类的readyRead信号 定义在QIODevice
QTcpSocket的基类是QAbstractSocket,QAbstractSocket的基类是QIODevice
发现原则10:一个类的头文件里 有好多槽函数,但是#include却不包含该工程里的其他类头文件
说明它是最底下的一个类,connect只与基类连接 都是this
发现原则11:信号总是发给别的类的,在头文件里看不到自己会接收什么信号,只有在实例化要给自己发信号的类的指针后,connect之后才会知道。
connect的时机,一般是给这个类包含的那个 给信号类实例化时绑定。
发现原则12:在connect看关系,只能看到接收,看不到这个类要发给谁,就是这个类的槽函数都接啥。在emit处才能看到发给谁

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中,信号是一种用于对象间通信的机制。信号是对象发出的事件,而是对这些事件进行响应的函数。当一个信号被触发时,与之相连接的函数将会被调用。 在Qt中,信号函数可以具有不同的参数类型。当信号函数的参数类型不匹配时,Qt会自动进行类型转换。但是,如果你需要传递额外的参数给函数,你可以使用信号函数指针参数。 具体来说,你可以在信号函数的定义中使用指针参数。当信号被触发时,可以通过指针参数传递额外的数据给函数。这样,函数就可以根据传递的数据进行相应的处理。 下面是一个示例代码,演示了如何在Qt中使用信号函数指针参数: ```cpp class MyObject : public QObject { Q_OBJECT public: MyObject(QObject *parent = nullptr) : QObject(parent) {} signals: void mySignal(int value, QString text); public slots: void mySlot(int value, QString text) { // 处理传递过来的参数 qDebug() << "Received value:" << value; qDebug() << "Received text:" << text; } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyObject obj; // 连接信号函数 QObject::connect(&obj, &MyObject::mySignal, &obj, &MyObject::mySlot); // 触发信号,并传递参数 emit obj.mySignal(42, "Hello, world!"); return app.exec(); } ``` 在上面的示例中,`mySignal`信号带有两个参数:一个整数和一个字符串。`mySlot`函数也带有相同的参数。通过使用信号函数指针参数,我们可以将信号的参数传递给函数进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胸毛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值