精华内容
下载资源
问答
  • Qt进程间通信
    千次阅读
    2020-04-26 16:05:48

    简述

    进程间通信,就是在不同进程之间传播或交换信息。

    通信方式

    管道(pipe):

    管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    有名管道(named pipe):

    有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    信号量(semophore):

    信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    消息队列(message queue):

    消息队列就是消息的一个链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    信号(signal):

    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    共享内存(shared memory):

    共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

    套接字(socket):

    套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    Qt进程通信

    在Qt应用程序中,Qt提供了几个方法来实现进程间通信(IPC)。可以在助手中查找关键字”Inter-Process”进行查找。

    TCP/IP

    跨平台的Qt Network模块提供的类可以让网络编程更加便携和方便。它提供了高级类(例如:QNetworkAccessManager、QFtp)通信,使用特定的应用程序级协议,和较底层的类(例如:QTcpSocket、QTcpServer、QSslSocket)用于实现协议。

    Shared Memory

    跨平台的QSharedMemory-共享内存类,提供对操作系统的共享内存的实现。它允许多个线程和进程安全访问共享内存段。此外,QSystemSemaphore可以用来控制访问由系统共享的资源,以及进程之间的通信。

    D-Bus

    Qt的D-Bus模块是一种可用于使用D-Bus协议实现IPC的唯一Unix库。它将Qt的信号和槽机制延伸到IPC级别,允许由一个进程发出的信号被连接到另一个进程的槽。Qt的D-Bus文档已经详细说明如何使用Qt中的D-Bus模块。

    QProcess

    跨平台类QProcess可以用于启动外部程序作为子进程,并与它们进行通信。它提供了用于监测和控制该子进程状态的API。另外,QProcess为从QIODevice继承的子进程提供了输入/输出通道。

    Session Management

    在Linux/X11平台上,Qt提供了会话管理的支持。会话允许事件传播到进程,例如,当检测到关机时。进程和应用程序可以执行任何必要的操作,例如:保存打开的文档。

    原文链接:https://blog.csdn.net/liang19890820/article/details/50589285.

    更多相关内容
  • Qt进程间通信与同步示例,通过QFile内存映射文件来共享内存达到进程间通信的效果。同时利用QSystemSemaphore 来实现进程同步
  • QT进程监视.rar

    2019-10-29 15:52:24
    本资源是实现了QT环境下的进程监视功能,运行前将配置文件与执行文件放在同一目录下。
  • Qt实现共享内存的例子,共分为两个部分,sharedmemory_write是共享发起端,sharedmemory_read是共享接收端。
  • QT 进程间通信——共享内存-附件资源
  • QT进程间通讯

    2022-05-01 13:56:08
    Qt提供了几种在Qt应用程序中实现进程间通信(IPC)的方式。 通过消息进行传递 通过向指定的进程传递消息事件的方式进行通信。QT是通过nativeEvent()函数来捕获window系统发送过来的消息。 windows上的应用例程:...

    不错的内容整理:
    1.https://www.csdn.net/tags/MtjaUg0sMjk1ODQtYmxvZwO0O0OO0O0O.html
    2.https://blog.51cto.com/quantfabric/1879762

    Qt提供了几种在Qt应用程序中实现进程间通信(IPC)的方式。

    通过消息进行传递

    通过向指定的进程传递消息事件的方式进行通信。QT是通过nativeEvent()函数来捕获window系统发送过来的消息。
    windows上的应用例程:https://blog.csdn.net/u012719076/article/details/122975520

    TCP / IP

    跨平台的Qt网络模块提供了使网络编程可移植且容易的类。它提供了使用特定的应用程序级协议进行通信的高层类(例如QNetworkAccessManager),以及用于实现协议的较低层的类(例如QTcpSocket,QTcpServer,QSslSocket)。

    本地服务器/套接字

    跨平台的Qt网络模块提供了使本地网络编程可移植且容易的类。它提供了QLocalServer和QLocalSocket类,它们允许在本地设置中进行类似网络的通信。它们的TCP对应对象可以用作即插即用的替代品,以使跨网络的通信正常进行。

    共享内存

    跨平台共享内存类QSharedMemory提供对操作系统的共享内存实现的访问。它允许通过多个线程和进程安全地访问共享内存段。此外,QSystemSemaphore可用于控制对系统共享资源的访问,以及在进程之间进行通信。
    例程:https://blog.csdn.net/u012719076/article/details/122968753
    QT6中QSystemSemaphore说明:https://doc.qt.io/qt-5.15/qsystemsemaphore.html#details

    D-Bus通讯协定

    Qt D-Bus模块是一个unix专用库,可以使用D-Bus协议来实现IPC。它将Qt的信号和插槽机制扩展到IPC级别,允许一个进程发出的信号连接到另一个进程中的插槽。Qt D-Bus文档有关于如何使用Qt D-Bus模块的详细信息。
    QT6中D-Bus说明手册:https://doc.qt.io/qt-6/qtdbus-index.html

    Qt COmmunications Protocol (QCOP)

    QCopChannel 类实现了一种通过命名管道在进程间传递消息的协议。QCopChannel只能用在嵌入式Linux。像QDbus模块一样,QCopChannel也把信号和槽机制扩展到了进程间通信,不过和QDbus模块不同的是,QCOP不依赖第三方的库。
    备注:QCopChannel 好像主要针对的是qtopia平台.比较新的qt版本应该支持dbus通讯,貌似被舍弃了。

    QProcess 类

    跨平台类QProcess可用于将外部程序作为子进程启动,并与它们进行通信。它提供了一个用于监视和控制子进程状态的API。QProcess将进程视为顺序I/O设备,可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为它继承了QIODevice,所以QProcess也可以用作QXmlReader的输入源,或者用来生成要使用QNetworkAccessManager上传的数据。
    QT5.15中QProcess说明:https://doc.qt.io/qt-5.15/qprocess.html
    QT5.15中QProcessEnvironment说明:https://doc.qt.io/qt-5.15/qprocessenvironment.html
    进程的环境由一组称为环境变量的键=值对组成。QProcessEnvironment类封装了该概念,并允许轻松地操作这些变量。它应该与QProcess一起使用,为子进程设置环境。它不能用于更改当前进程的环境。

    会话管理

    作用是:系统意外退出时保存应用程序的当前状态,方便下次重启时恢复。
    在Linux/X11、Windows和macOS上,Qt提供对会话管理的支持。会话允许将事件传播到进程,例如,在发生关闭时通知进程。然后,流程和应用程序可以执行任何必要的操作,比如保存打开的文档。
    QT6说明手册网址:https://doc.qt.io/qt-6/session.html

    展开全文
  • 进程是操作系统的基础之一。...在 Qt 中,我们使用QProcess来表示一个进程。这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。
  • 通过QtDBus,可以将Qt的信号槽机制上升到不同进程之间通信。 使用系统:银河麒麟 Qt版本:4.6.1 网上教程说,qmake编译需要将QT+= qDbus添加到pro工程里 添加后提示找不到该模块,在包含头文件后使用函数时报了找不...

    通过QtDBus,可以将Qt的信号槽机制上升到不同进程之间通信。

    使用系统:银河麒麟
    Qt版本:4.6.1

    网上教程说,qmake编译需要将QT+= qDbus添加到pro工程里

    添加后提示找不到该模块,在包含头文件后使用函数时报了找不到定义的编译错误。

    经过一下午的排查尝试,最后发现在pro工程里添加

    QT += dbus
    

    便能正确的将模块加载进来了。

    示例程序:
    本程序中服务端运行后弹出窗口,此时运行发送端将关闭服务端弹出的窗口。
    调用端:
    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QtDBus/QDBusConnection>
    #include <QtDBus/QDBusError>
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    

    main.cpp

    //#include "widget.h"
    #include <QCoreApplication>
    #include <QtDBus/QDBusConnection>
    #include <QtDBus/QDBusError>
    #include <QtDBus/QDBusMessage>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     //   Widget w;
     //   w.show();
        //构造一个消息
    
        QDBusMessage message = QDBusMessage::createMethodCall("com.scorpio.test",
                                 "/home/kylin",
                                 "com.scorpio.test.close",
                                 "closeWidget");
         //发送消息
        QDBusMessage response = QDBusConnection::sessionBus().call(message);
        if(response.type()==QDBusMessage::ReplyMessage)
        {
            int value = response.arguments().takeFirst().toInt();
            qDebug()<<QString("value==%1").arg(value);
        }
        else
        {
            qDebug()<<"value method called failed:"<<response.type();
        }
      //  return 0;
    
        return a.exec();
    }
    
    

    受控服务端:
    main.cpp

    
    #include <QApplication>
    #include <QDebug>
    #include <QtDBus/QDBusConnection>
    #include <QtDBus/QDBusError>
    #include "widget.h"
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //建立到session bus的连接
        QDBusConnection connection = QDBusConnection::sessionBus();
        //在session bus上注册名为com.scorpio.test的服务
        if(!connection.registerService("com.scorpio.test"))
        {
            qDebug()<<connection.lastError().message();
            exit(-1);
        }
        Widget w;
        connection.registerObject("/home/kylin",&w,QDBusConnection::ExportAllSlots);
        w.show();
        return a.exec();
    }
    
    

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QObject>
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
        Q_CLASSINFO("D-Bus Interface","com.scorpio.test.close")
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    public slots:
        int closeWidget();
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    

    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;
    }
    
    int Widget::closeWidget()
    {
        this->close();
        return 1;
    }
    
    

    参数解释:

    对象路径
    像网络主机,应用程序通过导出对象为其它应用程序提供特定服务。这些对象按层次组织,非常类似类的父子关系,派生自 QObject 占有。不管怎样,一种区别是存在根对象概念 (所有对象具有最终父级)。
    若继续与 Web 服务进行类比,对象路径等同于 URL 的路径部分
    像它们,D-Bus 对象路径的形成类似文件系统路径名:它们是以斜杠分隔的标签,各标签的组成由字母、数字及下划线字符 ( _ )。它们必须始终以斜杠开头,且不能以斜杠结尾。

    服务名称
    当通过总线通信时,应用程序获得所谓的服务名称:这就是该应用程序选择被同一总线中,其它应用程序知道的方式。服务名称由 D-Bus 总线代理程序守护,用于将消息从一个应用程序路由到另一个应用程序。与服务名称类似的概念是 IP 地址和主机名:根据计算机提供给网络的服务,一台计算机通常具有一个 IP 地址,且可能具有一个或多个与其关联的主机名。
    另一方面,若不使用总线,也不会使用服务名称。若再将其与计算机网络进行比较,这相当于点对点网络:由于对等方是已知的,因此不需要使用主机名来查找它 (或其 IP 地址)。
    D-Bus 服务名称的格式实际上非常类似于主机名:它是由点分隔的字母和数字的序列。常见实践甚至是根据定义该服务的组织的域名,来命名一服务名称。
    例如,D-Bus 服务的定义通过 freedesktop.org 且可以在总线中找到以下服务名称:

    org.freedesktop.DBus

    接口
    接口类似 C++ 抽象类和 Java 的 interface 关键词和声明在调用者和被调用者之间建立的契约。也就是说,它们建立的方法、信号及特性的名称是可用的,及行为是双方期望的当建立通信时。
    Qt 使用非常类似的机制在其 插件系统 :C++ 中的基类关联唯一标识符,通过方式 Q_DECLARE_INTERFACE () 宏。
    实际上,D-Bus 接口名称的命名方式与 Qt 插件系统的建议类似:标识符的构造通常来自定义该接口的实体的域名

    展开全文
  • QT进程监控 托盘

    2016-03-22 09:25:39
    自己实现的进程监控,托盘程序。
  • Qt进程工具

    2018-05-30 19:06:58
    Qt进程工具 检测进程
  • windows下通过FindWindow抓取Qt进程主界面,并嵌入到自己的程序中显示.抓取的Qt程序界面坐标响应异常,导致菜单栏和工具栏无法正常鼠标事件解决方案.
  • Qt进程-QProcess使用总结

    千次阅读 2020-05-31 21:23:49
    一、启动外部程序分为两种方式: 阻塞式 execute() ...execute("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1"); 非阻塞式 start() 和 startDetached() QProcess *pCaller =

    Qt进程

    这篇博客主要关于在Qt中使用进程的相关内容,包含有Qt自带的class类QProcess和使用C语言fork出来的进程,两种创建进程的方式。

    QProcess

    这里主要包含使用QProcess的启动方式以及同步进程相关的API

    启动外部程序分为两种方式:

    1. 阻塞式 execute()
    QProcess *pCaller = new QProcess();
    // 阻塞调用 当前窗口处理结束关闭之后 主窗口才能操作
    pCaller->execute("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");
    
    1. 非阻塞式 start()startDetached()
    QProcess *pCaller = new QProcess();
    // 非阻塞调用 当前窗口的执行状态不影响主窗口的操作
    pCaller->startDetached("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", QStringList());  
    pCaller->start("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");
    

    非阻塞式调用分为两种:
    (1)一体式: start()

    void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)
    

    外部程序启动后,将随主程序的退出而退出。

    (2)分离式:startDetached

    void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0
    

    外部程序启动后,当主程序退出时并不退出,而是继续运行。

    这里需要注意在获取processId进程ID的时候,由于在非阻塞式分离式启动线程的方法中,有一个参数默认设置为0,因此,获取该方法产生的进程ID是均是0.

    Synchronous Process API (同步进程API)

    QProcess提供了一系列的函数以提到事件循环来完成同步操作:

    (1)waitForStarted(): 阻塞,直到外部程序启动
    (2)waitForReadyRead(): 阻塞,直到输出通道中的新数据可读
    (3)waitForBytesWritten() : 阻塞,直到输入通道中的数据被写入
    (4)waitForFinished(): 阻塞,直到外部程序结束果在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。

    实例程序

    // Qt进程调用可执行程序
    void MainWindow::on_pBtn_Process_clicked()
    {
        QProcess *pCaller = new QProcess();
        // 阻塞调用 当前窗口处理结束关闭之后 主窗口才能操作
        // pCaller->execute("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");
        // 非阻塞调用 当前窗口的执行状态不影 影响主窗口的操作
        pCaller->start("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1");
        // startDetached
        // pCaller->startDetached("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", QStringList());
        // printf("pCaller->processId() = %d\n", getpid());
        llPid[iPidCnt++] = pCaller->processId();
    }
    
    

    fork子进程

    fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。点击这里有更详细关于fork()函数的解释。

    实例程序

    // C进程 调用可执行程序
    
    int MainWindow::set_cpu(int iCpuID)
    {
        cpu_set_t stMask;
        CPU_ZERO(&stMask);
        CPU_SET(iCpuID, &stMask);
        return sched_setaffinity(0, sizeof(cpu_set_t), &stMask);
    }
    void MainWindow::on_pBtn_OK_clicked()
    {
        pid_t stPid;
        stPid = fork();
        set_cpu(0);
        if(stPid < 0){
            printf("创建子进程失败!\n");
            return ;
        }
        if(stPid == 0){
            set_cpu(1);
            int iErr = execl("/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", "/home/gsk/Qt/build-Demo-child1-Desktop_Qt_5_12_3_GCC_64bit-Debug/Demo-child1", NULL);
            printf("%d\n", iErr);
        }
    }
    

    获取进程的ID

    在QProcess中,通过Qt中的API processId()可以获取当前进程的ID(需注意,对于start()开启的进程,可以通过该API获取进程ID,但对于startDetached()开启的进程,获取的进程ID是0,关闭该进程,就会关闭系统);在fork产生的进程中可以使用getpid()获取进程ID使用getppid()获取该进程父进程的ID。

    关于进程0和进程1:

    • 所有进程的祖先叫做进程0,idle进程或者swapper进程,它是在Linux的初始化阶段从无到有的创建的内核进程(该进程描述符使用的是静态分配的数据结构,其他进程都是动态分配的)
    • 进程0调用start_kernel()函数初始化内核需要的所有数据结构,激活中断,创建一个进程1的内核进程(init进程),进程0和进程1 共享每进程的所有内核数据结构。
    • 多处理器中,每个CPU都有自己的进程0。进程0创建的内核进程执行init()函数初始化内核。然后调用execve()系统调用装入可执行程序init.至此,init为一个普通的进程,且拥有每进程内核数据结构。在系统关闭之前,init一直存在,它创建和监控在操作系统外层的执行的所有进程的活动。
    展开全文
  • 1.使用 QT ::QProcess 类的接口函数 waitForStarted() 出现 A进程退出来了 B进程一直没有起来的情况, 2. 解决方法: 在 waitFor Started() 后加延时1s可以解决 2)Qt 提供进程状态接口state , 确认进程状态 是 ...
  • QT 进程之间使用共享内存进行通讯,并且两个进程均可进行修改结构体数据,AB两个工程均能对共享数据进行修改,而且修改的是结构体数据。 对应的文章请看:https://mp.csdn.net/mp_blog/creation/editor/122968753
  • Qt源码解析 索引 Qt程序开发时经常需要启动外部程序,这个通常使用QProcess挺好解决的...可以将calc嵌入到您自己的应用程序中,但它仍然可以在它自己的进程空间中运行. UAC可能还会施加一些限制,但这取决于计算方法的推
  • QT进程通信

    2017-12-19 13:52:43
    qt 写的一个多进程 通信的例子. 利用qprocess 启动多个外部进程,利用QSharedMemory共享内存 实现消息交换。如果跨机子就需要写socket了
  • qt进程通讯

    2012-03-28 19:56:20
    这个事qt进程间通讯技术,利用共享内存实现两个进程间的通讯,可以参考
  • Qt进程间通信及简单例子

    千次阅读 2020-02-22 23:19:50
    Qt提供了几种在Qt应用程序中实现进程间通信(IPC)的方式。 1. TCP/IP 跨平台的QtNetwork模块提供了可以简单实现网络编程的类。它提供了特定的应用层协议通信的高级别的类(像QNetworkAccessManager,QFtp)和低...
  • #include &lt;window.h&gt; #include "tlhelp32.h" #include &lt;...//判断进程是否存在 BOOL IsExistProcess(const char* szProcessName) { PROCESSENTRY32 processEnt...
  • 一个例子:通过Windows窗口消息实现 QT进程间通信,实现消息在进程间互发
  • Qdebus
  • QT多个命名管道通信,并与C#客户端同时多个通信, 同时已有C#的客户端与服务器的通信,QTQT的通信,QT与C#的通信,只要把管道名改为一至即可。
  • QT开发(三十五)——QT进程间通信_天山老妖S_51CTO博客 QT开发(三十五)——QT进程间通信 Qt 是一个跨平台的应用框架,其进程间通信机制当然可以使用所在平台的进程间通信机制,如在Windows平台上的Message机制、...
  • 文章目录序言进程间通讯方式使用原因共享内存通讯的几个问题解决问题Qt 同步信号量代码示例单向主从通讯服务端进程发送server.hserver.cpp客户端进程接收client.hclient.cpp运行结果双向全工通讯服务端server....
  • QT 进程间通信——Socket通信

    千次阅读 2019-05-24 11:16:04
    通过Qt提供的QtNetwork模块即可实现进程间通信,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用。QtNetwork模块提供的类能够创建基于TCP/IP的客户端与服务端应用程序。为实现底层的网络访问,...
  • 外部进程嵌入到Qt进程界面

    万次阅读 多人点赞 2017-11-14 20:49:19
    有时候需要做框架集成的东西,需要把其他客户端像组件...下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。 一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜
  • Qt 之进程间通信(IPC)简述通信目的通信方式Qt进程通信TCP/IPShared MemoryD-BusQProcessSession Management更多参考 原文链接:https://blog.csdn.net/liang19890820/article/details/50589285 简述 进程间通信,...
  • Qt进程的创建及注意事项

    千次阅读 2017-01-10 23:22:49
    QProcess的作用是在当前进程中创建一个新的进程,来调用外部程序处理完成一些任务而不影响本进程的继续执行,起用法如下: 1. 运用QProcess类创建新进程: QProcess proc = new QProcess(); 2. 链接进程退出...
  • QT进程间通信

    2021-05-06 22:55:50
    Qt Remote Object(QtRO)实现进程间通信>> 概述: 这是Qt5.9以后官方推出来的新模块 Qt官方推出的这个新模块是基于Socket来封装的,兼容LPC和RPC LPC即Local Process Communication,而RPC是指Remote ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,744
精华内容 12,697
关键字:

qt 进程