首页 > 其他分享 >Qt5.14.2论Qt大神如何华丽操控计算机系统

Qt5.14.2论Qt大神如何华丽操控计算机系统

时间:2024-03-28 21:32:50浏览次数:13  
标签:Qt5.14 Qt QHostInfo 大神 获取 connect 我们


身为一名程序员,难免要与计算机系统打交道。而要想高效地和系统沟通、指挥它为我们工作,最好的办法莫过于拥有一个强大的跨平台开发框架了。今天,就让我们一同领略Qt大神如何在此领域内驰骋自如,优雅地操控系统完成各种任务吧!


第一弹:潜力无限,Qt大神从获取信息开始


作为系统控制的第一步,我们要先搞清楚当前系统的一些基本信息,比如屏幕分辨率、主机名、IP地址等。对于我们的Qt大神来说,这根本就是小菜一碟。来,让我们一睹真容:
// 获取屏幕分辨率
QRect desktopRect = QApplication::desktop()->screenGeometry();
int screen_width = desktopRect.width();
int screen_height = desktopRect.height();

// 获取本机名和IP地址
QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());
QString localHostName = info.localHostName();

foreach(QHostAddress address, info.addresses())  
{
    if(address.protocol() == QAbstractSocket::IPv4Protocol) 
         qDebug("Local IPv4 Address: %s", qPrintable(address.toString()));
}

// 根据网址获取IP地址
QHostInfo::lookupHost("www.qt.io", 
                      this, 
                      SLOT(lookedUp(QHostInfo)));

// Qt5 新特性 - 并行网络查找
QHostInfo::lookupHost("www.baidu.com", this, 
                      &MyClass::lookedUp,
                      QHostInfo::ParallelLookup); 

void MyClass::lookedUp(const QHostInfo &host)
{
    if (host.error() != QHostInfo::NoError) {
        qDebug() << "Lookup failed:" << host.errorString();
        return;
    }

    foreach (const QHostAddress &address, host.addresses())
        qDebug() << "Found IPv4 address:" << address.toString(); 
}

获取屏幕分辨率只需调用QDesktopWidget的screenGeometry()方法即可轻松获取。本机的主机名和IP则需要先通过QHostInfo::fromName()来查找,然后遍历addresses()列表获取所有IPv4地址。

有了本机IP地址后,我们可以继续使用QHostInfo::lookupHost()方法获取指定网址的IP地址。值得一提的是,QHostInfo甚至支持并行网络查找,可以充分发挥多核CPU的能力,让解析变得更加高效。

一旦有网址查找完成,Qt就会触发lookupHost信号,我们在槽函数中获取查找结果。如果一切正常,则可以顺利地循环遍历出该网址的所有IP地址。

看来在获取系统信息这一块,Qt的能力已经初见端倪了。那么,接下来让我们看看,Qt还能为我们做些什么更高级的把戏吧!


第二弹:高手过招,Qt大神尽显身手


在获取了基本信息后,接下来是时候施展真正的高级功夫了。看看下面这些代码,Qt到底又为我们暗藏了怎样的玄妙手段呢?

// 判断键盘按键
bool isEscapePressed = false;
QObject::connect(qApp, &QApplication::keyPressEvent, [&](QKeyEvent *event) {
    if(event->key() == Qt::Key_Escape)
        isEscapePressed = true;
});

// 获取环境变量
QStringList envVars = QProcess::systemEnvironment();
qDebug() << "PATH:" << envVars.filter(QRegularExpression("PATH")).first();

// 执行系统命令
QProcess *proc = new QProcess(this);  
proc->start("cmd.exe", QStringList() << "/c" << "dir *.cpp"); //Windows
proc->start("ls *.cpp"); //Linux

QObject::connect(proc, &QProcess::readyReadStandardOutput, [&]() {  
    QByteArray output = proc->readAllStandardOutput();
    qDebug().noquote() << QString::fromLocal8Bit(output);
});

首先,我们看到了如何通过QApplication注册全局按键事件的代码。只要有按键被按下,Qt的事件循环就会调用键盘事件处理器。我们在这里捕获Esc键的按下,从而判断用户的退出意图。

接下来是如何获取系统中所有环境变量的方法。QProcess::systemEnvironment()会返回一个环境变量字符串列表,我们可以遍历它或者直接用正则表达式进行过滤。

最后一段代码则展示了如何在Qt程序中执行系统命令的高级玩法。首先新建QProcess实例,然后根据当前操作系统,传入合适的命令和参数给start()方法。无论是Windows的dir命令还是Linux的ls命令,Qt都可以为我们调用并获取输出。

连接QProcess的readyReadStandardOutput信号,我们就能不断地读取到命令执行时输出到标准输出的实时数据。这无疑为我们展示了Qt操控系统的无与伦比的能力。

通过以上展示,相信你已经初步领会到了Qt大神们牛逼的系统操控技能。不过别着急,他们的底蕴可远不止如此。我们接下来就一同继续探究Qt更为深邃的系统编程哲学!


第三弹:臻于化境,Qt大神笑傲江湖


翻开Qt编程经的下半部,就将映入眼帘的是一片汪洋大海般的精髓和奥妙。看看这些令人赞叹的代码示例,Qt大神们对于操控系统已经将之化为了一种炉火纯青的修行之道:

// 多线程计算PI
QThread workerThread;    
QObject *refreshObj = new PiCalcRefresh; // 接收计算结果的对象
refreshObj->moveToThread(&workerThread);
QObject::connect(&workerThread, &QThread::finished, refreshObj, &QObject::deleteLater);

PiCalcThread *calcObj = new PiCalcThread; // 计算PI值的线程对象
calcObj->moveToThread(&workerThread);
QObject::connect(&workerThread, &QThread::started, calcObj, &PiCalcThread::calculatePiOp); 
QObject::connect(calcObj, &PiCalcThread::resultReady, refreshObj, &PiCalcRefresh::showPiValue);

workerThread.start();

//在非GUI线程获取OpenGL上下文
QOpenGLContext *ctx = QOpenGLContext::currentContext();
if (!ctx) {
    ctx = new QOpenGLContext;
    ctx->create();
    ctx->moveToThread(QThread::currentThread());
}
ctx->makeCurrent(this); 
// ... OpenGL
// 跨平台文件I/O
QFile dataFile("data.bin");
if (dataFile.open(QFile::ReadWrite)) {
    QDataStream out(&dataFile);
    out.setVersion(QDataStream::Qt_5_3);
    out << QString("The magic number is: ")
        << (qint32)0x001cb845;
}

// 网络编程
QTcpSocket *tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::connected, this, &Client::sendRequest);
connect(tcpSocket, &QTcpSocket::readyRead, this, &Client::processResponse);

void Client::sendRequest() {
    QByteArray request("GET / HTTP/1.1\r\n\r\n");
    tcpSocket->write(request);
}

void Client::processResponse() {
    QByteArray data = tcpSocket->readAll();
    // 处理服务器响应数据...
}

// IPC通信
QLocalServer server;
server.listen("myserver");
connect(&server, &QLocalServer::newLocalConnection, [&](){
    QLocalSocket *socket = server.nextPendingConnection();
    connect(socket, &QLocalSocket::readyRead, [=](){
        QByteArray data = socket->readAll();
        // 处理收到的数据...
    });
});

在上面这段精彩的代码中,我们可以看到Qt大神走过路过不能不再次路过的几个经典场景。

首先是跨平台的文件I/O操作,QFile结合QDataStream就能轻松读写二进制文件,并精确控制数据格式。

接着是网络编程,Qt内置的QTcpSocket模块让我们可以像操作文件一样自如地和网络服务器进行TCP通信,只需几行就能发送请求并处理响应。

最后则是IPC(进程间通信),通过QLocalServer和QLocalSocket,我们可以在同一台机器上的不同进程间高效安全地传递数据,这无疑是系统编程不可或缺的一部分。

看到这里,你对Qt大神的系统编程修为是否有了新的认识?他们向我们娓娓道来的,不正是如何跨越层层障碍,直抵事物的本质,最终达到与系统合二为一,谙熟自在的无上境界吗?


隐藏达摩,潜力无穷


然而,就算Qt的强大能力让人赞叹不已,它的探索之路也绝不会止步于此。事实上,在Qt的璀璨光芒之下,始终蕴含着一股暗流涌动,那就是它对最前沿领域的不懈关注。

总之,Qt之所以称为编程界的"大神",就在于它永不自满、勇于创新的品格。它时刻关注着前沿科技的发展趋势,主动为我们提供一流的工具,引领方向。

所以,相信在不久的将来,Qt一定能为我们带来更多令人惊艳的黑科技,助力我们一同走向更广阔的系统编程疆场,向着更高的终极编程之道奋勇前进!你,我,我们一起期待!

标签:Qt5.14,Qt,QHostInfo,大神,获取,connect,我们
From: https://blog.csdn.net/lizhong2008/article/details/137121803

相关文章

  • QT数据类型和容器用法
    Qt库提供了基于通用模板的容器类,这些类可用于存储指定类型的数据项,Qt中这些容器类的设计比STL容器更轻,更安全且更易于使用。容器类也都是隐式共的,它们是可重入的,并且已针对速度/低内存消耗和最小的内联代码扩展进行了优化,从而生成了较小的可执行文件。容器类是基于模板的类,......
  • Qt显示图像汇总
    1、QLabelQt居中显示图片,图过大则出现滚动条(ui方式)的两种方法Label+ScrollArea、GraphicsView-夕西行-博客园(cnblogs.com)2、QWidget+QPainter自定义控件QOpenGLWidget并实现缩放(纯代码)-夕西行-博客园(cnblogs.com)3、QGraphicsViewQt显示图像之QGraphicsPixmapI......
  • Qt显示图像之QGraphicsPixmapItem
    为防止不断地addItem导致内存增长,建议在初始化时newItem、scene->addItem。在合适的地方scene->removeItem(或scene->clear)或者item->setVisible。h头文件中#include<QGraphicsView>QGraphicsView*view;QGraphicsScene*scene;QGraphicsPixmapItem*m_pix=nullptr;cp......
  • QT串口通信原理加实例
    串口通信原理:一、串口通信的基本原理串口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位(bit);在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开......
  • QT在界面两点画一条线并测算距离
    记录一下在界面划线的过程在QT插件界面有QProductSetShowWidget2::QProductSetShowWidget2(QWidget*parent)框其中缺陷图片是由ui->def_view设置def_view是一个自定义类 QSynchShowImageView继承自vml::QZoomGraphicsView再继承自QT官方的QGraphicsView在类QSynchShowIm......
  • QTable自适应行宽度
    #include<QFontMetrics>#include<QFont>voidTableWidget::setH(QStringListstrlist){   setHorizontalHeaderLabels(strlist);   intsizeAll=0;   QList<int>sizeList;   for(inti=0;i<strlist.size();i++)   {      QF......
  • Qt 操作sql server数据库
    Qt操作sqlserver数据库添加qtsql的库连接数据库QSqlDatabase_db=QSqlDatabase::addDatabase("QODBC");_db.setHostName();_db.setDatabaseName();_db.setUserName();_db.setPassword();_db.setPort();_db.open();增QSqlQueryquery;query.prepare("INSER......
  • centos7 mosquitto (MQTT)安装/配置/自启动
    **************************************************************windows:>>一、安装及配置mosquitto1.下载并安装mosquitto(官网下载地址https://mosquitto.org/download/)>安装完成后进入安装目录1).编辑mosquitto.conf文件.注意系统防火墙得允许tcp1883端口#设......
  • Qt消息机制和事件
    事件事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。在前面我们也曾经简单提到,Qt程序需要在......
  • Qt小知识4.QWindow和QWidget
    1引言QWindow和QWidget都是Qt框架中用于创建和管理窗口的类,但它们在设计上服务于不同的目的和场景。这两者的区别不仅体现在API设计上,还体现在它们在Qt框架中的角色和使用方式上。2典型区别2.1继承结构和依赖QWidget继承自QObject和QPaintDevice,是所有窗口部......