【QT常用技术讲解】tableWidget右键菜单及多进程编程

news2025/1/8 6:06:41

前言

        本文在QT项目的开发框架的基础上(源代码)增加tableWidget的右键菜单功能,并使用进程实现ping计算机的功能来讲解,本文不对进程间通信进行讲解。

概述

        一个项目在开发过程中,通常面临着引入“第三方应用”,有些应用提供了源代码、动态库,这些是可以平滑的“嵌入”到项目代码中(比如框架里的xml处理等),但有些是固化的应用,比如后台命令行的ping等,在QT项目需要时,启动一个新进程执行命令并获取返回结果即可达到项目目的,框架里面特意提供了tools目录,目的就是用于存放“第三方”可用的工具。

应用效果图

图1 tableWidget的右键菜单功能--ping此计算机

图2 ping对话框(创建新进程执行后台ping命令并获取返回结果)

功能讲解

1、tableWidget添加右键菜单功能

首先提供setContextMenuPolicy设置右键功能,在tab_basemsg.cpp中增加以下代码:

ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置右键菜单功能

接下来需要在tab_basemsg.h中添加槽函数,分成两种情况:

private slots:

    //处理右键菜单请求
    void on_tableWidget_customContextMenuRequested(const QPoint &pos);//此为系统默认响应槽函数
    void tableWidget_MenuRequested(const QPoint &pos);//需要通过connect指向

(1)如果声明on_tableWidget_customContextMenuRequested(const QPoint &pos);系统默认绑定了右键菜单功能,不需要connect来关联信号和槽;

(2)如果声明中不带on_tableWidget_,比如声明tableWidget_MenuRequested(const QPoint &pos);时,必须使用connect来关联信号和槽,为了代码管理规范,简易用此种方式。

此时在tab_basemsg.cpp中增加connect连接信号和槽函数:

ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置右键菜单功能
connect(ui->tableWidget, &QTableWidget::customContextMenuRequested, this, &tab_basemsg::tableWidget_MenuRequested);

在tab_basemsg.cpp中槽函数代码如下:

void tab_basemsg::tableWidget_MenuRequested(const QPoint &pos) {
    QModelIndex index = ui->tableWidget->indexAt(pos);
    if (!index.isValid()) return;

    QMenu menu(this);
    QAction *DiplaymsgAction = menu.addAction(tr("查看详情"));
    connect(DiplaymsgAction,&QAction::triggered,[=](){
        //获取选择的单元格
        QList<QTableWidgetItem *> selected_cells = ui->tableWidget->selectedItems();
        if(!selected_cells.isEmpty()){
            QTableWidgetItem *codeCell = ui->tableWidget->item(selected_cells.first()->row(),HEAD_BASEMSG_CODE);
            if(codeCell!=nullptr){
                QString code = codeCell->text();
                stBasemsg basemsg=m_basemsgmap[code];
                basemsgDialg->setModal(false);
                basemsgDialg->setWindowTitle("保存");
                //basemsgDialg->setFixedSize(500,400);
                basemsgDialg->open();
                basemsgDialg->init(1,basemsg);
                basemsgDialg->exec();
            }
        }
    });
    QAction *NetpingAction = menu.addAction(tr("Ping此计算机"));
    connect(NetpingAction,&QAction::triggered,[=](){
        //获取选择的单元格
        QList<QTableWidgetItem *> selected_cells = ui->tableWidget->selectedItems();
        if(!selected_cells.isEmpty()){
            QTableWidgetItem *codeCell = ui->tableWidget->item(selected_cells.first()->row(),HEAD_BASEMSG_CODE);
            if(codeCell!=nullptr){
                QString code = codeCell->text();
                stBasemsg basemsg=m_basemsgmap[code];
                QString ip=basemsg.Ip;
                qDebug() << __LINE__ << ip;
                pingdlg->setIp(ip);
                pingdlg->setModal(false);
                pingdlg->setWindowTitle("PING测试");
                pingdlg->setFixedSize(500,400);
                pingdlg->open();
                pingdlg->init();
                pingdlg->exec();
            }
        }
    });

    menu.exec(QCursor::pos());
    //menu.exec(ui->tableWidget->mapToGlobal(pos));
}

详细的右键菜单功能是在槽函数中增加的,增加的方式如下:

QMenu menu(this);
QAction *DiplaymsgAction = menu.addAction(tr("查看详情"));
connect(DiplaymsgAction,&QAction::triggered,[=](){});
QAction *NetpingAction = menu.addAction(tr("Ping此计算机"));
connect(NetpingAction,&QAction::triggered,[=](){});

2、多进程调用后台命令

通过QProcess process;(头文件#include <QProcess>)调用新进程来执行后台命令,并获取返回值输出到文本框中,如下代码所示

#include <QTextCodec>
#include <QProcess>
void pingDialog::on_start_clicked()
{
    ui->textBrowser->setReadOnly(false);//
    ui->textBrowser->setText("--------ping start--------");
    QString times = ui->timeBox->currentText();
    QString Ipstr=ui->ipEdit->text();
    QString cmd = QString("ping -n %1 %2").arg(times).arg(Ipstr);//组装命令

    m_isStart=true;
    QProcess process;//创建新进程
    process.start(cmd);//通过新进程执行后台命令
    if(process.waitForFinished()){//等待进程返回后获取输出内容
        // 读取进程的输出
        QString output = QString::fromLocal8Bit(process.readAllStandardOutput());
        QTextCodec *codec = QTextCodec::codecForName("GBK");
        QString unicodeOutput = codec->toUnicode(output.toLocal8Bit());
        ui->textBrowser->append(unicodeOutput);
    }
}

注意事项

直接使用QProcess执行后台命令时,在命令执行过程中(比如把ping的次数调为10次),QT应用是卡死的,用鼠标根本拉不动,原因是调用进程执行后台命令时,对于QT来说是阻塞方式!!要等进程输出内容返回后才恢复,这种在体验上很不友好,下一篇【QT常用技术讲解】多线程编程处理卡顿将引入多线程来解决此类阻塞问题。

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

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

相关文章

二叉树:镜像树,子结构,二叉树转链表,二叉树的倒数K个数,对称,Z型打印

1.把一棵二叉树转换为它的镜像树。 void mirror_tree(TreeNode *root) {if(rootNULL) return ;TreeNode *temproot->right;root->rightroot->left;root->lefttemp;mirror_tree(root->right);mirror_tree(root->left);}2、输入两棵二叉树A&#xff0c;B&…

Day 21

Java Script 1.什么是JavaScript 概述 JavaScript是一门世界上最流行的脚本语言 Java、JavaScript 一个合格的后端人员&#xff0c;必须要精通JavaScript 历史 JavaScript 的历史_javascript历史-CSDN博客 ECMAScript它可以理解为是JavaScript的一个标准 2.基本使用及…

AI智能名片微信小程序在社群运营中的价值与应用研究

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;社群运营已成为企业营销策略的重要组成部分&#xff0c;它不仅促进了品牌与消费者之间的深度互动&#xff0c;还为企业带来了持续的用户增长和价值转化。本文深入探讨了AI智能名片微信小程序在社群运营中的创新应用&#xff0…

常用数据库详解:从关系型到非关系型的探索

常用数据库详解&#xff1a;深入探索关系型与非关系型数据库 在数据驱动的世界中&#xff0c;数据库系统是存储、管理、检索和更新数据的核心技术。从历史悠久的关系型数据库到新兴的非关系型数据库&#xff0c;每种数据库都有其独特的设计哲学、优势和适用场景。本文将深入探…

不同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ

ARM架构、X86架构、Window系统环境下RabbitMQ的安装 RabbitMQ安装1 Erlang语言介绍2 安装Erlang2.1 ARM架构的CentOS虚拟机中安装Erlang2.2 X86架构的CentOS虚拟机中安装Erlang2.3 Windows系统安装Erlang2.3.1 下载Erlang2.3.2 安装Erlang2.3.3 配置Erlang2.3.4 检测Erlang 3.安…

资质延期成本预测:河南建筑装饰企业预算制定策略

资质延期成本预测对于河南建筑装饰企业来说是确保企业资质顺利延续的重要环节。以下是企业预算制定策略的一些关键点&#xff1a; 一、了解政策与要求 首先&#xff0c;河南建筑装饰企业需要详细了解河南省住房和城乡建设厅及相关部门关于资质延期的具体政策和要求。这包括延…

Linux Vim实用教程:从新手到专家的完全指南

Linux Vim最全面的教程涵盖了从Vim的安装、基本操作、高级功能到个性化配置等各个方面&#xff0c;旨在帮助用户全面掌握这款强大的文本编辑器。下面将详细介绍Linux Vim的功能&#xff1a; 安装过程 在Debian/Ubuntu系统上安装Vim&#xff1a;需要执行sudo apt-get update和su…

目标检测综述文章解读——Object Detection in 20 Years: A Survey

论文&#xff1a;Object Detection in 20 Years: A Survey 作者&#xff1a;Zhengxia Zou, Keyan Chen, Zhenwei Shi, Yuhong Guo, Jieping Ye 链接&#xff1a;https://arxiv.org/abs/1905.05055 这是一篇关于目标检测综述性文章&#xff0c;自2019年5月第一次提交后&#xff…

前端(react)框架nextjs

文章目录 一、什么是next.js1. 路由2. 打包 next build3. 部署 二、 next.js 和react区别三、webstorm使用nextjs四、开发常用总结如何修nextjs 启动监听的端口号&#xff1f;NGINX 反向代理 Next.js 项目配置 参考 一、什么是next.js 官网&#xff1a; https://www.nextjs.cn…

使用C#(winform)调用STK并展示其3D/2D控件

最近有个需求要求对STK做二次开发&#xff0c;要用自己写的界面但又要嵌入STK的3D/2D控件展示&#xff0c;后台调用STK引擎做计算。官方文档语焉不详&#xff0c;网上的资料要么太多重复&#xff08;到处抄来抄去&#xff09;&#xff0c;要么有诸多错漏之处&#xff0c;找了很…

GB/T 28181-2022 公共安全视频监控联网系统:信息传输、交换、控制技术要求pdf协议文档下载,同时附GBT-28181-2016.pdf

国标GB28181 2016标准已经执行很多年了&#xff0c;可以说效果非常好&#xff0c;去年最新的GB28181-2022标准细节也出来了&#xff0c;本来是一个国家级的标准&#xff0c;现在想要下载这个协议标准&#xff0c;一堆网址要会员&#xff0c;要积分&#xff0c;我整理了一下&…

LabVIEW压电陶瓷阻抗测试系统

开发了一种基于LabVIEW软件与PXI模块化仪器的压电陶瓷阻抗测试系统。该系统能在高电压工作条件下测量压电陶瓷的阻抗特性&#xff0c;包括阻抗模值与阻抗角的频率特性&#xff0c;为压电陶瓷的进一步分析与应用提供了重要参考。 项目背景 现有的阻抗测试仪大多只能在低电压条件…

OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::filter2D() 函数用于对图像应用二维卷积滤波器。这个函数可以用来实现多种图像处理操作&#xff0c;如模糊、锐化、边缘检测等。它通过将一个…

什么是Docke,部署dockers,和基本操作命令

Docker简介 什么是容器 容器是用来装东西的&#xff0c;Linux 里面的容器是用来装应用的&#xff1b; 容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署&#xff1b; 容器技术已经成为应用程序封装和交付的核心技术&#xff1b; 容器原理&#xff1a;容器…

如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出(MSI/MSO)功能

通过模块内部共享输入/输出&#xff08;MSI/MSO&#xff09;功能&#xff0c;输入或输出模块可以将其输入或输出数据最多提供给4个IO控制器。 这篇文档介绍了如何在STEP 7 (TIA Portal)中配置访问共享的设备及模块内部共享输入/输出功能。可以在两个不同的项目里或同一个项目里…

24.8.3数据结构|双向循环链表、静态链表

双向循环链表 节点类型与双链表的节点类型完全相同双向循环链表的操作也与双链表的操作基本一致。 例题 将自然数一到N按由小到大的顺序沿顺时针方向围成一个圈&#xff0c;然后以一为起点先沿顺时针方向数到第N个数将其划去&#xff0c;再沿逆时针方向数到第K个数将其滑去&a…

密码加密机的功能模块

密码加密机&#xff0c;也称为加密机或硬件加密模块(HSM&#xff0c;Hardware Security Module)&#xff0c;是一种通过国家商用密码主管部门鉴定并批准使用的国内自主开发的主机加密设备。以下是对密码加密机的详细解析&#xff1a; 一、基本概述 定义&#xff1a;密码加密机是…

LabVIEW位移检测系统

工业控制器的位移检测在保证机械设备精确运行中发挥着重要的作用。开发了一种基于LabVIEW的高精度位移检测系统&#xff0c;该系统通过集成硬件与软件的优化配置&#xff0c;实现了对工业控制器位移的精确测量和分析。 项目背景 在传统工业生产中&#xff0c;位移检测系统往往…

macos 10.15系统:macOS Catalina for mac 正式版

macOS Catalina for mac (macos 10.15系统)详细的最新功能介绍&#xff0c;此次macOS Catalina 10.15.7正式版更新发布&#xff0c;本次更新主要为您的Mac提供了重要的安全性更新和错误修复。感兴趣的朋友&#xff0c;欢迎前来下载&#xff01; macOS Catalina 让你喜欢的种种…

JVM知识总结(CMS收集器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ CMS收集器 CMS&#xff08;Concurrent Mark Sweep&#xff09;收集…