基于QT的TCP通信实现(TCPServer和TCPClient)

2023-10-30


近期因为测试需要用到 TCPServer(TCP服务端)TCPClient(TCP客户端)来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,本文分享以下基于QT开发TCPServer和TCPClient的经验, 文中包括源码,在文末处包含项目的源码文件

一、软件介绍

TCPServer可以绑定一个ip地址并监听一个端口,在TCPServer绑定并监听状态时,可以使用TCPClient来连接服务端绑定的ip地址和端口,连接成功后便可进行通信了。下面首先演示以下服务端和客户端界面以及通信流程。

1.1 TCPServer服务端界面

  • 在服务端的界面中,“开始监听”按钮可以在设置“监听地址”、“监听端口”后点击既开始对此ip地址和端口进行监听,当有TCPClient客户端针对此ip地址和端口进行请求连接时便可进行连接,随后开始通信。
  • “停止监听”可以停止对ip地址和端口号的监听。
  • “清空文本框”按钮可以清空消息记录,方便连续信息的阅读。
  • “退出”按钮即关闭此软件。
  • “发送消息”可发送已经输入的内容。
    在这里插入图片描述

1.2 TCPClient客户端界面

  • 在客户端的界面中,“连接”按钮可以在设置“连接地址”、“端口”后点击既开始对此ip地址和端口进行请求连接,当有TCPServer服务端针对此ip地址和端口进行监听时便可进行连接,随后开始通信。
  • “断开连接”可以讲服务端和客户端已经建立的连接断开。
  • “清空文本框”按钮可以清空消息记录,方便连续信息的阅读。
  • “发送消息”和“清除”按钮分别可发送和清除已经输入的内容。
  • “退出”按钮即关闭此软件。
    在这里插入图片描述

1.3 服务端和客户端建立连接并通信演示

  • 首先在Server端我们绑定ip:192.168.31.222,端口:1200,然后点击“开始监听”按钮,这时服务端就开始等待Client端请求建立连接。
    在这里插入图片描述
  • 接下来我们使用客户端,连接地址和端口号设置为服务端所绑定的ip:192.168.31.222,端口:1200,然后点击“连接”按钮,可以看到双方建立连接成功,软件出现连接成功建立提示信息。
    在这里插入图片描述
  • 双方建立连接成功便可以开始通信,我们首先点击“清空文本框”把提示信息清除,然后使用TCPServer服务端发送一条信息“Hello,I’m TCPServer~”,可以看到客户端成功收到服务端发送的信息,[in]后边的内容为本端收到的信息,[out]后边的内容为本端发送的信息。
    在这里插入图片描述
  • 接下来我们使用TCPClient客户端给服务端发送一条信息“Hi,I’m TCPClient!”,可以看到服务端成功收到信息。
    在这里插入图片描述

二、QT实现TCPServer和TCPClient

我们想要在QT中实现TCP通信需要在.pro文件中添加下面一行代码:

QT       += network

2.1 TCPClient客户端

  • 首先我们应该包含下面三个头文件来支持我们调用内部的通信函数:
#include <QTcpSocket>
#include <QHostAddress>
#include <QHostInfo>
  • 创建QTcpSocket套接字对象
tcpClient = new QTcpSocket(this);
  • 使用tcpClient 对象连接服务器
tcpClient ->connectToHost(IP, port);
  • 然后我们用write()函数向服务器发送数据
tcpClient ->write(data);
  • 当tcpClient 接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

void MainWindow::onSocketReadyRead()
{//readyRead()信号槽函数
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}
  • 在我们通信完毕后需要断开连接
void MainWindow::on_actDisconnect_triggered()
{//断开与服务器的连接
    if (tcpClient->state()==QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
}

下面给出TCPClient的代码

  • main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.resize(700,900);
    w.show();

    return a.exec();
}

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QTcpSocket *tcpClient;  //socket
    QLabel *LabSocketState;  //状态栏显示标签

    QString getLocalIP();//获取本机IP地址
protected:
    void closeEvent(QCloseEvent *event);
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
//自定义槽函数
    void onConnected();
    void onDisconnected();
    void onSocketStateChange(QAbstractSocket::SocketState socketState);
    void onSocketReadyRead();//读取socket传入的数据

    void on_actConnect_triggered();
    void on_actDisconnect_triggered();
    void on_actClear_triggered();
    void on_btnSend_clicked();
    void on_btnClear_clicked();
    void on_actionTimeCurrent_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

  • mainwindow.cpp
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHostAddress>
#include <QHostInfo>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    tcpClient = new QTcpSocket(this); //创建socket变量

    LabSocketState = new QLabel("Socket状态:");//状态栏标签
    LabSocketState->setMinimumWidth(250);
    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP
    this->setWindowTitle("TCP客户端");
    ui->comboServer->addItem(localIP);

    setFocusPolicy(Qt::StrongFocus);
    installEventFilter(this); 

    connect(tcpClient,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

    connect(tcpClient,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onConnected()
{ //connected()信号槽函数
    ui->plainTextEdit->appendPlainText("**已连接到服务器");
    ui->plainTextEdit->appendPlainText("**peer address:"+tcpClient->peerAddress().toString());
    ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpClient->peerPort()));
    ui->actConnect->setEnabled(false);
    ui->actDisconnect->setEnabled(true);
}

QString MainWindow::getLocalIP()
{
    QString hostName = QHostInfo::localHostName();//本地主机名
    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    QString localIP = "";

    QList<QHostAddress> addList=hostInfo.addresses();

    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost = addList.at(i);
        if (QAbstractSocket::IPv4Protocol == aHost.protocol())
        {
            localIP=aHost.toString();
            break;
        }
    }
    return localIP;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
    if (tcpClient->state() == QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
    event->accept();
}

void MainWindow::onDisconnected()
{//disConnected()信号槽函数
    ui->plainTextEdit->appendPlainText("**已断开与服务器的连接");
    ui->actConnect->setEnabled(true);
    ui->actDisconnect->setEnabled(false);
}

void MainWindow::onSocketReadyRead()
{//readyRead()信号槽函数
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{//stateChange()信号槽函数
    switch(socketState)
    {
    case QAbstractSocket::UnconnectedState:
        LabSocketState->setText("scoket状态:UnconnectedState");
        break;
    case QAbstractSocket::HostLookupState:
        LabSocketState->setText("scoket状态:HostLookupState");
        break;
    case QAbstractSocket::ConnectingState:
        LabSocketState->setText("scoket状态:ConnectingState");
        break;

    case QAbstractSocket::ConnectedState:
        LabSocketState->setText("scoket状态:ConnectedState");
        break;

    case QAbstractSocket::BoundState:
        LabSocketState->setText("scoket状态:BoundState");
        break;

    case QAbstractSocket::ClosingState:
        LabSocketState->setText("scoket状态:ClosingState");
        break;

    case QAbstractSocket::ListeningState:
        LabSocketState->setText("scoket状态:ListeningState");
    }
}

void MainWindow::on_actConnect_triggered()
{//连接到服务器
    QString addr=ui->comboServer->currentText();
    quint16 port=ui->spinPort->value();
    tcpClient->connectToHost(addr,port);
}

void MainWindow::on_actDisconnect_triggered()
{//断开与服务器的连接
    if (tcpClient->state()==QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
}

void MainWindow::on_actClear_triggered()
{
    ui->plainTextEdit->clear();
}

void MainWindow::on_btnSend_clicked()
{//发送数据

    QString msg=ui->editMsg->toPlainText();
    ui->plainTextEdit->appendPlainText("[out] "+msg);

    ui->editMsg->setFocus();

    QByteArray str = msg.toLatin1();
    str.append("\r\n");
    tcpClient->write(str);
}

void MainWindow::on_btnClear_clicked()
{
    ui->editMsg->clear();
}

void MainWindow::on_actionTimeCurrent_triggered()
{
    QString msg=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
    ui->plainTextEdit->appendPlainText(+" [out] "+msg);

    ui->editMsg->setFocus();

    QByteArray str = msg.toLatin1();
    str.append("\r\n\r\n");
    tcpClient->write(str);
}

  • ui界面
    在这里插入图片描述

2.1 TCPServer服务端

  • 首先需要包含下面的头文件来提供我们需要调用的函数:
#include <QTcpServer>
#include <QtNetwork>
  • 然后创建TCPServer对象
tcpServer=new QTcpServer(this);
  • 绑定ip并监听端口功能,为客户端可以通过这个端口访问服务器
tcpServer->listen(addr,port);
  • 当tcpServer被tcpClient访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

void MainWindow::onNewConnection()
{
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
    onClientConnected();
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}
  • 使用tcpSocket的write()函数向客户端发送数据
tcpSocket->write(data);
  • 当tcpSocket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

void MainWindow::onSocketReadyRead()
{
    while(tcpSocket->canReadLine()){
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
    }
}
  • 停止监听
void MainWindow::on_actStop_triggered()
{
    if (tcpServer->isListening()) //tcpServer正在监听
    {
        tcpServer->close();//停止监听
        ui->actStart->setEnabled(true);
        ui->actStop->setEnabled(false);
        LabListen->setText("监听状态:已停止监听");
    }
}

下面给出TCPServer的代码

  • main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.resize(600,700);
    w.show();

    return a.exec();
}

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

protected:
    void closeEvent(QCloseEvent *event);//关闭窗口时停止监听

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void onNewConnection();//QTcpServer的newConnection()信号
    void onSocketStateChange(QAbstractSocket::SocketState socketState);//底部socket状态变化
    void onClientConnected(); //客户端接入时
    void onClientDisconnected();//客户端断开连接时
    void onSocketReadyRead();//读取socket传入的数据

    void on_actStart_triggered();//开始监听
    void on_actStop_triggered();//停止监听
    void on_actClear_triggered();//清空
    void on_btnSend_clicked();//发送消息
    void on_actHostInfo_triggered();//获取本机地址

private:
    Ui::MainWindow *ui;
    QLabel *LabListen;//状态栏标签
    QLabel *LabSocketState;//状态栏标签
    QTcpServer *tcpServer; //TCP服务器
    QTcpSocket *tcpSocket;//TCP通讯的Socket
    QString getLocalIP();//获取本机IP地址
};

#endif // MAINWINDOW_H

  • mainwindow.cpp
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    LabListen=new QLabel("监听状态:");
    LabListen->setMinimumWidth(150);
    ui->statusBar->addWidget(LabListen);

    LabSocketState=new QLabel("Socket状态:");
    LabSocketState->setMinimumWidth(200);
    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP
    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);
    ui->comboIP->addItem(localIP);

    tcpServer=new QTcpServer(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

QString MainWindow::getLocalIP()
{
    QString hostName=QHostInfo::localHostName();//本地主机名
    QHostInfo hostInfo=QHostInfo::fromName(hostName);
    QString localIP="";

    QList<QHostAddress> addList=hostInfo.addresses();

    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        if (QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            localIP=aHost.toString();
            break;
        }
    }
    return localIP;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (tcpServer->isListening())
        tcpServer->close();//停止网络监听
    event->accept();
}

void MainWindow::onNewConnection()
{
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
    onClientConnected();
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{
    qDebug()<<"走到这了";
    switch(socketState)
    {
    case QAbstractSocket::UnconnectedState:
        LabSocketState->setText("scoket状态:UnconnectedState");
        break;
    case QAbstractSocket::HostLookupState:
        LabSocketState->setText("scoket状态:HostLookupState");
        break;
    case QAbstractSocket::ConnectingState:
        LabSocketState->setText("scoket状态:ConnectingState");
        break;
    case QAbstractSocket::ConnectedState:
        LabSocketState->setText("scoket状态:ConnectedState");
        break;
    case QAbstractSocket::BoundState:
        LabSocketState->setText("scoket状态:BoundState");
        break;
    case QAbstractSocket::ClosingState:
        LabSocketState->setText("scoket状态:ClosingState");
        break;
    case QAbstractSocket::ListeningState:
        LabSocketState->setText("scoket状态:ListeningState");
    }
}

void MainWindow::onClientConnected()
{
    ui->plainTextEdit->appendPlainText("**client socket connected");
    ui->plainTextEdit->appendPlainText("**peer address:"+tcpSocket->peerAddress().toString());
    ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpSocket->peerPort()));
}

void MainWindow::onClientDisconnected()
{
    ui->plainTextEdit->appendPlainText("**client socket disconnected");
    tcpSocket->deleteLater();
    //    deleteLater();//QObject::deleteLater();
}

void MainWindow::onSocketReadyRead()
{
    while(tcpSocket->canReadLine()){
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
    }
}

void MainWindow::on_actStart_triggered()
{
    QString IP=ui->comboIP->currentText();//IP地址
    quint16 port=ui->spinPort->value();//端口
    QHostAddress addr(IP);
    tcpServer->listen(addr,port);//
    ui->plainTextEdit->appendPlainText("**开始监听...");
    ui->plainTextEdit->appendPlainText("**服务器地址:"+tcpServer->serverAddress().toString());
    ui->plainTextEdit->appendPlainText("**服务器端口:"+QString::number(tcpServer->serverPort()));

    ui->actStart->setEnabled(false);
    ui->actStop->setEnabled(true);

    LabListen->setText("监听状态:正在监听");
}

void MainWindow::on_actStop_triggered()
{
    if (tcpServer->isListening()) //tcpServer正在监听
    {
        tcpServer->close();//停止监听
        ui->actStart->setEnabled(true);
        ui->actStop->setEnabled(false);
        LabListen->setText("监听状态:已停止监听");
    }
}

void MainWindow::on_actClear_triggered()
{
    ui->plainTextEdit->clear();
}

void MainWindow::on_btnSend_clicked()
{
    QString msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray str=msg.toUtf8();
    str.append("\r\n");//添加一个换行符
    tcpSocket->write(str);
}

void MainWindow::on_actHostInfo_triggered()
{
    QString hostName=QHostInfo::localHostName();//本地主机名
    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");
    QHostInfo hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();//
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        if (QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            QString IP=aHost.toString();
            ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());
            if (ui->comboIP->findText(IP)<0)
                ui->comboIP->addItem(IP);
        }
    }
}

  • ui界面
    在这里插入图片描述

三、代码分享

后续会写基于QT实现的UDP通信工具,下面给出代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于QT的TCP通信实现(TCPServer和TCPClient) 的相关文章

  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新窗体

    我是 Qt 的初学者 所以希望这是一个容易回答的问题 我有相当多的 C 经验 这部分不是问题 我的应用程序的目的是进行代码生成 最初是为类制作头文件和实现文件 我非常喜欢 Code Blocks 上的类向导 但我认为我可以做更多的事情 我有
  • 将 UTC 格式的 QDateTime 转换为本地系统时间

    我从这样的字符串构造 QDateTime QDateTime date QDateTime fromString 2010 10 25T10 28 58 570Z yyyy MM ddTHH mm ss zzzZ 我知道date是 UTC
  • 使用 Qt 的网络服务

    我正在寻找使用 Qt 服务器端 实现 Web 服务的代码 如果您有任何信息 我将不胜感激 Regards 您可以使用libqxt http libqxt bitbucket org doc 0 6 qxtweb html实现服务器端Web服
  • 当从 html 文件读取 Unicode 内容时,为什么 Unicode 字体在 QTextBrowser 中无法正确显示?

    我正在读一本html文件 该文件基本上包含Unicode案文如下 b akko sati kru akkh ti khy abbahati b h b But the QText浏览器不解释Unicode字体 所以QText浏览器显示如下
  • 如何在 Qt simple 上解密/加密某些字符串(例如密码)

    这是我得到的 Qt SDK版本4 6 2 视窗XP 问题 我怎样才能简单地加密和简单地加密QString价值 我需要它能够将一些加密的字符串保存到 INI 文件中 并在重新打开应用程序后将字符串加密为正常的密码字符串值 PS 我正在寻找简单
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q

随机推荐

  • DenseNet网络详解及Pytorch实现

    DenseNet网络详解及Pytorch实现 DenseNet网络简介 DenseNet Densely Connected Convolutional Networks 是由Gao Huang等研究人员于2017年提出的一种深度神经网络架
  • dva.js 知识导图

    JavaScript语言 JavaScript语言 不要用 var 而是用 const 和 let 分别表示常量和变量 不同于 var 的函数作用域 const 和 let 都是块级作用域 模板字符串 模板字符串提供了另一种做字符串组合的方
  • HTTP与TCP的区别和联系

    相信不少初学应用网络程序开发的朋友都想知道Http与Socket连接究竟有什么区别 希望通过自己的浅显理解能对初学者有所帮助 一 基本概念 1 TCP连接 手机能够使用联网功能是因为手机底层实现了TCP IP协议 可以使手机终端通过无线网络
  • Java中常用的一种时间格式的转换方法

    有时需要将一种格式的时间转化成其他格式的时间 这里列举了一种常用的转换方法 将从控件获得类似于 Thu Jan 01 00 00 00 CST 2009 的时间格式转化称 yyyy MM dd 格式 DateFormat format1 n
  • Java基础16--面向对象:抽象类

    Java基础16 面向对象 抽象类 文章目录 Java基础16 面向对象 抽象类 概述 抽象类 继承抽象类 抽象方法 抽象类总结规定 概述 在面向对象的概念中 所有的对象都是通过类来描绘的 但是反过来 并不是所有的类都是用来描绘对象的 如果
  • 带你知道如何在Flask中集成支付宝第三方支付模块并进行联调?

    支付宝沙箱 支付宝沙箱基础配置 支付宝开放平台 如果从www alipay com访问 选择我是开发者 支付宝扫码登录 身份 自研开发者 控制台 gt 开发服务 gt 沙箱 gt 沙箱应用 沙箱 协助开发者进行接口开发及主要功能联调的模拟环
  • vue2.0 关于 vue.config.js配置项详解

    const CompressionPlugin require compression webpack plugin 引入gzip压缩插件 const TerserPlugin require terser webpack plugin 代
  • 基于Selenium+Python的web自动化测试框架详解

    目录 一 什么是Selenium 二 自动化测试框架 三 自动化框架的设计和实现 四 需要改进的模块 五 总结 一 什么是Selenium Selenium是一个基于浏览器的自动化测试工具 它提供了一种跨平台 跨浏览器的端到端的web自动化
  • iOS之LLVM编译流程和Clang插件开发集成

    LLVM 简介 一 什么是 LLVM LLVM 是构架编译器 compiler 的框架系统 以 C 编写而成 用于优化以任意程序语言编写的程序的编译时间 compile time 链接时间 link time 运行时间 runtime 以及
  • 读书:《少即是多》

    少即时多 是本田直之的一本书 他还写过 杠杆阅读术 杠杆时间术 杠杆思考术 等 现在社会 物质财富的获得变得相对容易 但并没有让人更幸福 或者快乐持续的时间很短 随之而来的是担心 忧虑和负担 真正带来幸福的反而是减法 如何做减法 断舍离 L
  • 0)Visual C++2017概述

    文章目录 一 概述 二 字符集 1 C运行时库对Unicode的支持 2 C 标准库对Unicode的支持 3 Windows API 对Unicode 的支持 4 Visual C 2017对Unicode 的支持 三 SDK编程基础 1
  • 软件开发的未来已来:大数据、AI和云原生的终极融合如何引爆市场

    文章目录 1 智能化应用程序的崛起 2 实时数据分析和反馈 3 云原生的灵活性和可扩展性 4 跨行业的影响 5 数据驱动的决策 6 新的商业模式和机会 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏 收录专栏 大数据系列
  • 【LAMMPS系列】LAMMPS安装WIN并行版

    大家好 我是粥粥 LAMMPS 是一种经典的分子动力学代码 专注于材料建模 它是大型原子 分子大规模并行模拟器的首字母缩略词 LAMMPS 具有固态材料 金属 半导体 和软物质 生物分子 聚合物 以及粗粒或中等系统的势函数 它可用于模拟原子
  • 使用 KubeSkoop exporter 监测和定位容器网络抖动问题

    本文是 8 月 17 日直播的文字稿整理 微信公众号 阿里云云原生 可观看直播回放 除去文章内容外 还包括针对实际网络问题的实战环节 容器网络抖动问题发生频率低 时间短 是网络问题中最难定位和解决的问题之一 不仅如此 对 Kubernete
  • 小米手机自动进入Recovery恢复模式,且不停重启

    问题描述 2017年2月13日购买的小米手机 5S Plus 日前手机突然进入了 Recovery 模式 且重启手机又自动进入 Recovery 模式 不管它就不停的重启 连关机都做不到 即使把电用完 一直按住 电源键 和 音量键下 进入F
  • 预处理数据的方法总结(使用sklearn-preprocessing)

    预处理数 1 标准化 去均值 方差规模化 Standardization标准化 将特征数据的分布调整成标准正太分布 也叫高斯分布 也就是使得数据的均值维0 方差为1 标准化的原因在于如果有些特征的方差过大 则会主导目标函数从而使参数估计器无
  • python中字典的索引_在Python中使用范围作为字典索引

    本问题已经有最佳答案 请猛点这里访问 是否可以做如下的事情 r range 0 100 foo range 100 200 bar print r 42 gt foo 所以我想使用一个数字范围作为字典索引的一部分 为了使事情更复杂 我还想使
  • python去除最后的逗号_Python如何从打印中删除最后一个逗号(string,end=“,”)...

    forloop的输出是string for x in something some operation string x string print string 5 66 777 我使用下面的代码将它们放在同一行 pr2 然后我得到5 66
  • 微信小程序报错wx.getLocation need to be declared in the requiredPrivateInfos field in app.json

    wx getLocation need to be declared in the requiredPrivateInfos field in app json ext json env Windows mp 1 06 2301160 li
  • 基于QT的TCP通信实现(TCPServer和TCPClient)

    文章目录 一 软件介绍 1 1 TCPServer服务端界面 1 2 TCPClient客户端界面 1 3 服务端和客户端建立连接并通信演示 二 QT实现TCPServer和TCPClient 2 1 TCPClient客户端 2 1 TC