2023-12-05 Qt学习总结7


点击 <C 语言编程核心突破> 快速C语言入门


Qt学习总结

  • 前言
  • 二十 QTcpSocket QTcpServer网络库
      • 服务端代码:
      • 客户端代码
  • 二十一 QProcess进程类
  • 二十二 QThread线程
  • 总结


前言

要解决问题: 学习qt最核心知识, 多一个都不学.


二十 QTcpSocket QTcpServer网络库

QTcpSocketQTcpServer网络库是QT框架提供的网络编程库之一,用于实现TCP协议的网络通信。

下面是QTcpSocketQTcpServer网络库中常用的C++函数:

QTcpSocket常用函数:

  1. QTcpSocket(QObject *parent = nullptr):构造函数。
  2. void connectToHost(const QString &hostName, quint16 port):连接到指定的主机名和端口。
  3. void disconnectFromHost():断开与主机的连接。
  4. qint64 write(const char *data, qint64 maxSize):将数据写入套接字。
  5. QByteArray read(qint64 maxSize):从套接字中读取数据。
  6. bool waitForReadyRead(int msecs):等待套接字有可读数据的信号。
  7. bool waitForConnected(int msecs):等待套接字成功连接到主机的信号。
  8. void flush():将写入缓冲区的数据刷新到套接字。

QTcpServer常用函数:

  1. QTcpServer(QObject *parent = nullptr):构造函数。
  2. bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0):开始监听指定的地址和端口。
  3. void close():关闭套接字,停止监听。
  4. bool isListening() const:判断是否正在监听。
  5. QTcpSocket *nextPendingConnection():获取下一个挂起的连接。
  6. qintptr socketDescriptor() const:获取套接字的描述符。

以上是常用的QTcpSocketQTcpServer网络库C++函数,其他函数可参考QT官方文档。

示例:

在这里插入图片描述
在这里插入图片描述
关闭客户端, 再开启客户端连接, 发送信息
在这里插入图片描述

在这里插入图片描述

服务端代码:

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QTcpServer>
#include <QTcpSocket>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_cancelButton_clicked();void on_sendButton_clicked();public slots:void connectHandler();void reciveText();private:Ui::Widget *ui;QTcpServer *qtServer;QTcpSocket *qtSocket;
};
#endif // WIDGET_H

main.cpp

#include "Widget.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "Learn_18_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}Widget w;w.show();return a.exec();
}

Widget.cpp

#include "Widget.h"
#include "./ui_Widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), qtServer(new QTcpServer), qtSocket(nullptr)
{ui->setupUi(this);qtServer->listen(QHostAddress::AnyIPv4, 8000);connect(qtServer, SIGNAL(newConnection()), this, SLOT(connectHandler()));
}Widget::~Widget()
{delete ui;qtServer->close();if (qtSocket != nullptr){qtSocket->close();}
}void Widget::on_cancelButton_clicked()
{this->close();
}void Widget::connectHandler()
{if (qtSocket != nullptr){qtSocket->disconnect();qtSocket->disconnectFromHost();qtSocket->close();}qtSocket = qtServer->nextPendingConnection();ui->ipLineEdit->setText(qtSocket->peerAddress().toString());ui->portLineEdit->setText(QString::number(qtSocket->peerPort()));connect(qtSocket, SIGNAL(readyRead()), this, SLOT(reciveText()));connect(qtSocket, &QTcpSocket::disconnected,[this]() { qDebug() << "Disconnected"; });
}void Widget::reciveText()
{ui->reciveLineEdit->setText(QString(qtSocket->readAll()));
}void Widget::on_sendButton_clicked()
{if (qtSocket->isValid()){qtSocket->write(ui->sendLineEdit->text().toUtf8());}else{qDebug() << "unconnect";}
}

ui_Widget.h

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QLabel *label_5;QWidget *widget;QFormLayout *formLayout;QLabel *label;QLineEdit *ipLineEdit;QLabel *label_2;QLineEdit *portLineEdit;QLabel *label_3;QLineEdit *reciveLineEdit;QLabel *label_4;QLineEdit *sendLineEdit;QWidget *widget1;QHBoxLayout *horizontalLayout;QPushButton *sendButton;QPushButton *cancelButton;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(482, 419);label_5 = new QLabel(Widget);label_5->setObjectName("label_5");label_5->setGeometry(QRect(190, 20, 92, 50));label_5->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));widget = new QWidget(Widget);widget->setObjectName("widget");widget->setGeometry(QRect(10, 90, 461, 220));formLayout = new QFormLayout(widget);formLayout->setObjectName("formLayout");formLayout->setContentsMargins(0, 0, 0, 0);label = new QLabel(widget);label->setObjectName("label");label->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::LabelRole, label);ipLineEdit = new QLineEdit(widget);ipLineEdit->setObjectName("ipLineEdit");ipLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::FieldRole, ipLineEdit);label_2 = new QLabel(widget);label_2->setObjectName("label_2");label_2->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::LabelRole, label_2);portLineEdit = new QLineEdit(widget);portLineEdit->setObjectName("portLineEdit");portLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::FieldRole, portLineEdit);label_3 = new QLabel(widget);label_3->setObjectName("label_3");label_3->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(2, QFormLayout::LabelRole, label_3);reciveLineEdit = new QLineEdit(widget);reciveLineEdit->setObjectName("reciveLineEdit");reciveLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(2, QFormLayout::FieldRole, reciveLineEdit);label_4 = new QLabel(widget);label_4->setObjectName("label_4");label_4->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(3, QFormLayout::LabelRole, label_4);sendLineEdit = new QLineEdit(widget);sendLineEdit->setObjectName("sendLineEdit");sendLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(3, QFormLayout::FieldRole, sendLineEdit);widget1 = new QWidget(Widget);widget1->setObjectName("widget1");widget1->setGeometry(QRect(10, 330, 461, 54));horizontalLayout = new QHBoxLayout(widget1);horizontalLayout->setObjectName("horizontalLayout");horizontalLayout->setContentsMargins(0, 0, 0, 0);sendButton = new QPushButton(widget1);sendButton->setObjectName("sendButton");sendButton->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(sendButton);cancelButton = new QPushButton(widget1);cancelButton->setObjectName("cancelButton");cancelButton->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(cancelButton);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));label_5->setText(QCoreApplication::translate("Widget", "\346\234\215\345\212\241\347\253\257", nullptr));label->setText(QCoreApplication::translate("Widget", "IP\345\234\260\345\235\200", nullptr));label_2->setText(QCoreApplication::translate("Widget", "\347\253\257\345\217\243\345\217\267", nullptr));label_3->setText(QCoreApplication::translate("Widget", "\346\224\266  \346\226\207", nullptr));label_4->setText(QCoreApplication::translate("Widget", "\345\217\221  \346\226\207", nullptr));sendButton->setText(QCoreApplication::translate("Widget", "\345\217\221\351\200\201", nullptr));cancelButton->setText(QCoreApplication::translate("Widget", "\345\217\226\346\266\210", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

客户端代码

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QTcpSocket>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_linkButton_clicked();void on_sendButton_clicked();void on_cancelButton_clicked();public slots:void recieveText();private:Ui::Widget *ui;QTcpSocket *socket;
};
#endif // WIDGET_H

main.cpp

#include "Widget.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "Learn_19_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}Widget w;w.show();return a.exec();
}

Widget.cpp

#include "Widget.h"
#include "./ui_Widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket)
{ui->setupUi(this);connect(socket, &QTcpSocket::connected, [this]() { qDebug() << "OK"; });connect(socket, SIGNAL(readyRead()), this, SLOT(recieveText()));connect(socket, &QTcpSocket::disconnected,[this]() { qDebug() << "Disconnected"; });
}Widget::~Widget()
{delete ui;
}void Widget::on_linkButton_clicked()
{// socket->disconnect();QString ipAdd(ui->ipLineEdit->text());socket->connectToHost(QHostAddress(ipAdd),ui->portLineEdit->text().toUShort());
}void Widget::on_sendButton_clicked()
{if (socket->isValid()){socket->write(ui->sendLineEdit->text().toUtf8());}
}void Widget::on_cancelButton_clicked()
{this->close();
}void Widget::recieveText()
{QString res = QString::fromUtf8(socket->readAll());ui->recieveLineEdit->setText(res);qDebug() << res;
}

ui_Widget.h

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QLabel *label_5;QWidget *layoutWidget;QFormLayout *formLayout;QLabel *label;QLineEdit *ipLineEdit;QLabel *label_2;QLineEdit *portLineEdit;QLabel *label_3;QLineEdit *sendLineEdit;QLabel *label_4;QLineEdit *recieveLineEdit;QWidget *layoutWidget1;QHBoxLayout *horizontalLayout;QPushButton *linkButton;QPushButton *sendButton;QPushButton *cancelButton;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(555, 400);label_5 = new QLabel(Widget);label_5->setObjectName("label_5");label_5->setGeometry(QRect(220, 10, 101, 50));label_5->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));layoutWidget = new QWidget(Widget);layoutWidget->setObjectName("layoutWidget");layoutWidget->setGeometry(QRect(10, 80, 541, 220));formLayout = new QFormLayout(layoutWidget);formLayout->setObjectName("formLayout");formLayout->setContentsMargins(0, 0, 0, 0);label = new QLabel(layoutWidget);label->setObjectName("label");label->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::LabelRole, label);ipLineEdit = new QLineEdit(layoutWidget);ipLineEdit->setObjectName("ipLineEdit");ipLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::FieldRole, ipLineEdit);label_2 = new QLabel(layoutWidget);label_2->setObjectName("label_2");label_2->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::LabelRole, label_2);portLineEdit = new QLineEdit(layoutWidget);portLineEdit->setObjectName("portLineEdit");portLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::FieldRole, portLineEdit);label_3 = new QLabel(layoutWidget);label_3->setObjectName("label_3");label_3->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(2, QFormLayout::LabelRole, label_3);sendLineEdit = new QLineEdit(layoutWidget);sendLineEdit->setObjectName("sendLineEdit");sendLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(2, QFormLayout::FieldRole, sendLineEdit);label_4 = new QLabel(layoutWidget);label_4->setObjectName("label_4");label_4->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(3, QFormLayout::LabelRole, label_4);recieveLineEdit = new QLineEdit(layoutWidget);recieveLineEdit->setObjectName("recieveLineEdit");recieveLineEdit->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(3, QFormLayout::FieldRole, recieveLineEdit);layoutWidget1 = new QWidget(Widget);layoutWidget1->setObjectName("layoutWidget1");layoutWidget1->setGeometry(QRect(10, 330, 531, 54));horizontalLayout = new QHBoxLayout(layoutWidget1);horizontalLayout->setObjectName("horizontalLayout");horizontalLayout->setContentsMargins(0, 0, 0, 0);linkButton = new QPushButton(layoutWidget1);linkButton->setObjectName("linkButton");linkButton->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(linkButton);sendButton = new QPushButton(layoutWidget1);sendButton->setObjectName("sendButton");sendButton->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(sendButton);cancelButton = new QPushButton(layoutWidget1);cancelButton->setObjectName("cancelButton");cancelButton->setStyleSheet(QString::fromUtf8("font: 700 24pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));horizontalLayout->addWidget(cancelButton);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));label_5->setText(QCoreApplication::translate("Widget", "\345\256\242\346\210\267\347\253\257", nullptr));label->setText(QCoreApplication::translate("Widget", "IP", nullptr));ipLineEdit->setText(QCoreApplication::translate("Widget", "127.0.0.1", nullptr));label_2->setText(QCoreApplication::translate("Widget", "\347\253\257\345\217\243", nullptr));portLineEdit->setText(QCoreApplication::translate("Widget", "8000", nullptr));label_3->setText(QCoreApplication::translate("Widget", "\345\217\221\351\200\201", nullptr));label_4->setText(QCoreApplication::translate("Widget", "\346\216\245\346\224\266", nullptr));linkButton->setText(QCoreApplication::translate("Widget", "\350\277\236\346\216\245", nullptr));sendButton->setText(QCoreApplication::translate("Widget", "\345\217\221\351\200\201", nullptr));cancelButton->setText(QCoreApplication::translate("Widget", "\345\217\226\346\266\210", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

通常在建立qt项目时, 不会自动链接Network头文件及库文件, 需要在cmake文件中加入:

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Network)
target_link_libraries(Learn_18 PRIVATE Qt${QT_VERSION_MAJOR}::Network)

其中Learn_18是项目名, 根据你的项目更改.

二十一 QProcess进程类

QProcess是一个进程管理类,它允许您启动外部程序和与它们通信。

QProcess支持同步和异步启动,也可以使用管道和I / O重定向向子进程发送和接收数据。

下面是常用函数列表:

  1. QProcess(const QStringList &arguments = QStringList(), QObject *parent = nullptr) 该函数可以创建一个用于启动外部程序的QProcess对象,可以设置启动参数。

  2. setProgram(QString program) 设置要启动的程序或可执行文件的路径。

  3. setArguments(const QStringList &arguments) 设置启动参数列表。

  4. setWorkingDirectory(QString dir) 设置运行外部程序的工作目录。

  5. start(const QString &program, const QStringList &arguments = {}, OpenMode mode = ReadWrite); 启动外部程序。

  6. waitForStarted(int msecs = 30000) 等待外部程序启动,返回true表示启动成功,false表示启动失败。

  7. waitForFinished(int msecs = 30000) 等待外部程序执行完成,返回true表示执行完成,false表示超时或执行失败。

  8. readAllStandardOutput() 读取外部程序的标准输出,返回一个QByteArray

  9. readAllStandardError() 读取外部程序的标准错误输出,返回一个QByteArray

  10. void write(const QByteArray &byteArray) 向外部程序的标准输入写入数据。

您还可以使用QIODevice API通过管道与子进程通信。

常见的用法是通过标准输入输出管道或错误输出管道发送和接收数据。

您还可以使用readAllStandardOutput()readAllStandardError()函数来获取进程的输出和错误输出。

在非Windows平台上,QProcess使用QAbstractEventDispatcher来监视子进程。

使用QProcess的事件循环时,如果有进程事件到达,将调用QProcess的虚拟函数来处理该事件。

如果使用waitForStarted()waitForFinished()之类的功能等待进程,则QProcess将在事件循环内等待进程事件的到来。

Windows上,QProcess使用WaitHandle实现进程监视,并且可以兼容在Windows上使用其他Qt的进程相关类。

示例:
用进程类实现一个应用, 当点击run, 从命令和参数文本框获取命令文本, 并启动进程, 将结果返回到结果文本框中.
在这里插入图片描述
Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QProcess>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_runButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

main.cpp

#include "Widget.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "Learn_20_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}Widget w;w.show();return a.exec();
}

Widget.cpp

#include "Widget.h"
#include "./ui_Widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_runButton_clicked()
{QProcess process(this);QStringList qsl;qsl << ui->optionLineEdit->text();process.start(ui->commendLineEdit->text(), qsl);if (process.waitForStarted() && process.waitForFinished()){qDebug() << "OK";}QByteArray output = process.readAllStandardOutput();ui->resultTextEdit->setText(QString::fromLocal8Bit(output));qDebug() << QString::fromLocal8Bit(output);
}

ui_Widget.h

/********************************************************************************
** Form generated from reading UI file 'Widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QPushButton *runButton;QTextEdit *resultTextEdit;QWidget *layoutWidget;QFormLayout *formLayout;QLabel *label;QLabel *label_2;QLineEdit *commendLineEdit;QLineEdit *optionLineEdit;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName("Widget");Widget->resize(508, 577);runButton = new QPushButton(Widget);runButton->setObjectName("runButton");runButton->setGeometry(QRect(10, 530, 81, 31));runButton->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));resultTextEdit = new QTextEdit(Widget);resultTextEdit->setObjectName("resultTextEdit");resultTextEdit->setGeometry(QRect(10, 90, 491, 421));layoutWidget = new QWidget(Widget);layoutWidget->setObjectName("layoutWidget");layoutWidget->setGeometry(QRect(10, 10, 491, 72));formLayout = new QFormLayout(layoutWidget);formLayout->setObjectName("formLayout");formLayout->setContentsMargins(0, 0, 0, 0);label = new QLabel(layoutWidget);label->setObjectName("label");label->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::LabelRole, label);label_2 = new QLabel(layoutWidget);label_2->setObjectName("label_2");label_2->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(0, QFormLayout::FieldRole, label_2);commendLineEdit = new QLineEdit(layoutWidget);commendLineEdit->setObjectName("commendLineEdit");commendLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::LabelRole, commendLineEdit);optionLineEdit = new QLineEdit(layoutWidget);optionLineEdit->setObjectName("optionLineEdit");optionLineEdit->setStyleSheet(QString::fromUtf8("font: 700 16pt \"\351\230\277\351\207\214\345\267\264\345\267\264\346\231\256\346\203\240\344\275\223 B\";"));formLayout->setWidget(1, QFormLayout::FieldRole, optionLineEdit);retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));runButton->setText(QCoreApplication::translate("Widget", "run", nullptr));label->setText(QCoreApplication::translate("Widget", "\345\221\275\344\273\244", nullptr));label_2->setText(QCoreApplication::translate("Widget", "\345\217\202\346\225\260", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

二十二 QThread线程

QThread是Qt框架中的线程类,它提供了一个跨平台的线程类库,可以在Qt应用程序中实现多线程编程,实现并发执行任务的能力。

QThread类通过继承QThread并重载run()函数来实现自己的线程。

run()函数中包含了线程的逻辑代码,线程启动时会自动调用run()函数。

QThread还提供了一些常用的函数,如start()函数开始线程,quit()函数结束线程,wait()函数等待线程结束等。

常用函数:

start():启动线程,该函数将会调用run()函数;

sleep():暂停当前线程,单位毫秒;

quit():结束线程,类似于Thread类的Stop方法;

wait():等待当前线程执行完毕,阻塞当前线程;

finished():当线程执行结束时会发出该信号;

terminate():强制关闭线程,类似于Thread类的Abort方法。

C++示例:用线程返回相加结果, 并在主线程输出
在这里插入图片描述
我们实现一个myThread线程类, 继承自QThread, 当触发计算时, 调用槽函数, 生成线程, 线程运算相加结果, 并通过信号槽机制返回给主线程, 进行显示.

myThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class myThread : public QThread
{Q_OBJECTpublic:explicit myThread(QObject *parent = nullptr, int numA_ = 0, int numB_ = 0);void run() override;signals:void result(int);private:int numA;int numB;
};#endif // MYTHREAD_H

myThread.cpp

#include "myThread.h"myThread::myThread(QObject *parent, int numA_, int numB_): QThread{parent}, numA(numA_), numB(numB_)
{}void myThread::run()
{emit result(numA + numB);
}

通过简单的封装, 可以很容易的将数据传给线程, 通过信号槽机制, 又很容易的可以将结果返回, 相比C或C++原生thread, 已经人性化的一塌糊度了.

当然, 效率问题不在本文探讨之列.

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui
{
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void getResult(int res);private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

Widget.cpp

#include "Widget.h"
#include "./ui_Widget.h"
#include "myThread.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{int numA = ui->lineEditA->text().toInt();int numB = ui->lineEditB->text().toInt();myThread *qthrd = new myThread(this, numA, numB);qthrd->start();connect(qthrd, SIGNAL(result(int)), this, SLOT(getResult(int)));qthrd->wait();qthrd->deleteLater();
}void Widget::getResult(int res)
{ui->lineEditSum->setText(QString::number(res));
}

总结

二十 QTcpSocket QTcpServer网络库
服务端代码:
客户端代码
二十一 QProcess进程类
二十二 QThread线程


点击 <C 语言编程核心突破> 快速C语言入门


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续集成交付CICD:Jenkins流水线实现Nexus制品晋级策略

目录 一、理论 1.开发测试运维环境 二、实验 1.Nexus制品晋级策略 一、理论 1.开发测试运维环境 &#xff08;1&#xff09;环境 1&#xff09;持续集成开发环境&#xff08;DEV: Development Environment&#xff09; 直接通过源代码编译打包&#xff0c;其会跑单元测试…

机器学习算法(9)——集成技术(Bagging——随机森林分类器和回归)

一、说明 在这篇文章&#xff0c;我将向您解释集成技术和著名的集成技术之一&#xff0c;它属于装袋技术&#xff0c;称为随机森林分类器和回归。 集成技术是机器学习技术&#xff0c;它结合多个基本模块和模型来创建最佳预测模型。为了更好地理解这个定义&#xff0c;我们需要…

WLAN配置实验

本文记录了WLAN配置实践的过程&#xff0c;该操作在华为HCIA中属于相对较复杂的实验&#xff0c;记录过程备忘。这里不就WLAN原理解释&#xff0c;仅进行配置实践&#xff0c;可以作为学习原理时候的参考。本文使用华为ENSP进行仿真。实验拓扑图如下&#xff1a; 1.WLAN工作流程…

UE5数据传递-纹理贴图

期待结果&#xff1a; 流程 1. 通过C写入数据到纹理贴图 2. 在材质中通过采样能正确读取写入的数值 踩坑&#xff1a; 1. UE5之后&#xff0c;需要设置采样类型&#xff0c;才能达到上图效果&#xff0c;默认采样类型做了插值计算 FColor中写入 PF_B8G8R8A8 UTexture2D* Conve…

AI 绘画 | Stable Diffusion 艺术二维码制作

前言 这篇文章教会你如果用Stable Diffusion WEB UI制作艺术二维码,什么是艺术二维码呢?就是普通二维码和艺术图片融合后的二维码图片,如下图所示。主要原理还是使用controlNet的control_v1p_sd15_qrcode_monster模型和光影模型control_v1p_sd15_brightness。 教程 准备…

【论文阅读笔记】NeRF+Mip-NeRF+Instant-NGP

目录 前言NeRF神经辐射场体渲染连续体渲染体渲染离散化 方法位置编码分层采样体渲染推导公式&#xff08;1&#xff09;到公式&#xff08;2&#xff09;部分代码解读相机变换&#xff08;重要&#xff01;&#xff09; Mip-NerfTo do Instant-NGPTo do 前言 NeRF是NeRF系列的…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…

ingress介绍和ingress通过LoadBalancer暴露服务配置

目录 一.ingress基本原理介绍 1.将原有用于暴露服务和负载均衡的服务的三四层负载均衡变为一个七层负载均衡 2.controller和ingress 3.通过下面这个图可能会有更直观的理解 二.为什么会出现ingress 1.NodePort存在缺点 2.LoadBalancer存在缺点 三.ingress三种暴露服务的…

基于JavaWeb+SSM+Vue微信小程序的科创微应用平台系统的设计和实现

基于JavaWebSSMVue微信小程序的科创微应用平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术…

Linux Component概述和高通component的使用

1 Linux为什么要引入Component框架&#xff1f; 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块&#xff0c;内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

【C语言程序设计】编写简单的C程序

目录 前言 一、程序设计 二、程序改错 三、程序完善 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如…

unity 2d 入门 飞翔小鸟 死亡 显示GameOver(十四)

1、添加Img create->ui->img 把图片拖进去 2、和分数一样、调整位置 3、修改角色脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟&#xff08;刚体&#xff09;private Rigidbod…

【Apipost】批量删除我的51CTO文章

文章目录 一、序二、API分析三、Apipost测试四、脚本五、Apipost中完成 一、序 去年开始再51CTO同步更新文章&#xff0c;一年多过去了&#xff0c;只涨了3个粉丝。看了下这个平台就是卖课、搞培训的&#xff0c;退出了。决定把文章也删除了&#xff08;有人私信我说专门注册了…

ToolkenGPT:用大量工具增强LLM

深度学习自然语言处理 原创作者&#xff1a;cola 用外部工具增强大型语言模型(LLM)已经成为解决复杂问题的一种方法。然而&#xff0c;用样例数据对LLM进行微调的传统方法&#xff0c;可能既昂贵又局限于一组预定义的工具。最近的上下文学习范式缓解了这一问题&#xff0c;但有…

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述&#xff1a;ll命令用于显示指定工作目录下的内容。 命令格式&#xff1a;ll [参数] [目录名]。 参数说明&#xff1a; 参数说明-a显示所有文件及目录&#xff08;包括隐藏文…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果&#xff0c;明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据&#xff1a;采集&#xff08;爬取&#xff09;数据&#xff0c;生成&#xff08;导入&#xff09;数据&#xff0c;进行数据清洗…

代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 &#xff5c;二叉树 &#xff5c;101. 对称二叉树 题目描述解题思路 & 代码实现递归法迭代法使用队列使用栈 题目描述 101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,…

zcms企业官网建站系统源码搭建-支持页面自定义

1.支持mysql&#xff0c;sqlite&#xff0c;access三种数据库。 2.模板和标签与asp版的zzzcms通用。 3.asp版的zzzcms的access数据库可直接使用。 4.支持手机站。 &#xff08;增删改查不做描述&#xff09;&#xff1a; 网站信息 名称&#xff0c;logo&#xff0c;微信&…

基于OpenCV的流水线包装箱检测计数应用(附源码)

导 读 本文主要介绍基于OpenCV的流水线包装箱检测计数应用,并给出源码。 资源下载 完整代码和视频下载地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代码如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…

【MYSQL】单表查询

查询语法&#xff1a; select 字段&#xff08;*表示全字段&#xff09; from 数据表 【where 条件表达式】 【group by 分组字段【having 分组条件表达式】】 【order by 排序字段【asc | desc】】 例子&#xff1a; 教职工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…