Qt 学习笔记 6.Qt中的通信机制

Qt 中常见的通信方式有以下几种:

  1. 信号与槽机制
  2. 事件机制
  3. 进程间通信
  4. 网络通信

1. 信号与槽机制

Qt 的信号与槽机制是一种非常常用的通信方式,它通过一个类的成员函数和另一个对象的信号进行连接,当信号被触发时,相应的槽函数会执行。

示例:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
 	QApplication app(argc, argv);
    QPushButton button("Click me");
    QObject::connect(&button, &QPushButton::clicked, &app, &QApplication::quit);
    button.show();
    
    return app.exec();
}

在这个简单的示例中,当按钮被点击时,应用程序就会退出。
注意到的是,由于 QObject::connect 建立连接,当按钮被点击时会触发 QApplication::quit 这个槽函数,使应用程序退出。

2. 事件机制

Qt 中的事件机制通过事件的分发和处理来实现通信。事件可以是系统在运行时发出的,也可以是应用程序本身发出的,它们通过事件循环分发给 QObject 对象的特定方法进行处理。

示例:

#include <QApplication>
#include <QWidget>
#include <QKeyEvent>

class MyWidget : public QWidget {

public:
	MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}

protected:
	void keyPressEvent(QKeyEvent *event) override {
		if(event->key() == Qt::Key_Escape) {
			qApp->quit();
		}
	}
	
};

int main(int argc, char *argv[]) {
	QApplication app(argc, argv);
	MyWidget widget;
	widget.show();
	
	return app.exec();
}

在这个示例中,我们创建了一个自定义的 MyWidget,重写了它的 keyPressEvent 方法。
当用户按下 Esc 键时,就会触发该事件,应用程序会调用 qApp->quit() 函数来退出应用程序。

3. 进程间通信

Qt 中可以使用本地套接字实现进程间通信,这种方式通常用于在不同的进程之间传输数据。

示例:

服务端代码:

#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#include <QDataStream>
#include <QMessageBox>

int main(int argc, char *argv[]) {
	QCoreApplication app(argc, argv);
	QLocalServer server;
	server.listen("MyServerName");
	QObject::connect(&server, &QLocalServer::newConnection, [&]() {
		QLocalSocket *socket = server.nextPendingConnection();
		if(socket) {
			QDataStream in(socket);
			in.setVersion(QDataStream::Qt_5_15);
			QString message;
			in >> message;
			qDebug() << message;
			socket->write("Hello client!");
			socket->flush();
			socket->waitForBytesWritten();
			socket->close();
		}
	});
	
	return app.exec();
}

客户端代码:

#include <QtNetwork/QLocalSocket>'
#include <QDataStream>
#include <QMessageBox>

int main(int argc, char *argv[]) {
	QCoreApplication app(argc, argv);
	QLocalSocket socket;
	socket.connectToServer("MyServerName");
	if(socket.waitForConnected()) {
		QDataStream out(&socket);
		out.setVersion(QDataStream::Qt_5_15);
		out << QString("Hello server!");
		socket.waitForReadyRead();
		QDataStream in(&socket);
		in.setVersion(QDataStream::Qt_5_15);
		QString message;
		in >> message;
		qDebug() << message;
		socket.close();
	}
	
	return app.exec();
}

在这个示例中,我们创建了一个本地套接字服务器来接收来自客户端的消息。当一个新的连接被建立时,服务器就会读取来自客户端的消息并返回一个简单的响应。

4. 网络通信

Qt 的网络通信框架提供了一种简单的方式来在客户端和服务器之间传输数据,包括 TCPUDPHTTP 协议。

示例:

服务端代码:

#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QDataStream>

int main(int argc, char *argv[]) {
	QCoreApplication app(argc, argv);
	QTcpServer server;
	server.listen(QHostAddress::Any, 12345);
	QObject::connect(&server, &QTcpServer::newConnection, [&]() {
		QTcpSocket *socket = server.nextPendingConnection();
		if(socket) {
			QDataStream in(socket);
			in.setVersion(QDataStream::Qt_5_15);
			QString message;
			in >> message;
			qDebug() << message;
			socket->write("Hello client!");
			socket->flush();
			socket->waitForBytesWritten();
			socket->close();
		}
	});
	
	return app.exec();
}

客户端代码:

#include <QtNetwork/QTcpSocket>
#include <QDataStream>

int main(int argc, char *argv[]) {
	QCoreApplication app(argc, argv);
	QTcpSocket socket;
	socket.connectToHost("localhost", 12345);
	if(socket.waitForConnected()) {
		QDataStream out(&socket);
		out.setVersion(QDataStream::Qt_5_15);
		out << QString("Hello server!");
		socket.waitForReadyRead();
		QDataStream in(&socket);
		in.setVersion(QDataStream::Qt_5_15);
		QString message;
		in >> message;
		qDebug() << message;
		socket.close();
	}
	
	return app.exec();
}

在这个示例中,我们创建了一个简单的 TCP 服务器,并使用一个 TCP 客户端来向服务器发送消息。服务器读取来自客户端的消息,并向客户端返回一个简单的响应。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值