Qt实现自定义行编辑器

引言

  • 开发环境
  • 项目结构
  • ui界面设计
  • 示例代码
  • 运行效果
  • 总结

qt中原有的行编辑器无法满足当前的需要,所以需要自定义行编辑器。
通过上下按键切换到不同的行编辑器,在选中的行编辑器中输入数字,编辑器呈现边框,编辑后按下回车键保存之前编辑的数值,没有按下回车键直接切换上下键之前编辑的数字没有被保存,编辑器中继续显示之前的数值。于此同时会根据不同的位数在数值前自动补齐。
直接上效果图:

20241213_182339

开发环境

Ubuntu系统下QtCreator。
在这里插入图片描述

项目结构

项目的结构如下:
在这里插入图片描述

ui界面设计

dialog.ui
在这里插入图片描述
对应的结构:
在这里插入图片描述
form1.ui
在这里插入图片描述
对应的结构:
在这里插入图片描述
form2.ui
在这里插入图片描述
对应的结构
在这里插入图片描述
结构太长一图没法截,接着看下图:
在这里插入图片描述
自己对着看吧。

示例代码

main.cpp

#include "dialog.h"

#include <QApplication>

int main(int argc, char *argv[])
{
   
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include "form1.h"
#include "form2.h"
#include <QDialog>

QT_BEGIN_NAMESPACE
namespace Ui {
    class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
   
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
private:
    void initInterfaceParameters();
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Dialog *ui;
    Form1* m_pForm1;
    Form2* m_pForm2;

};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
   
    ui->setupUi(this);
    m_pForm1 = new Form1;
    m_pForm2 = new Form2;
    initInterfaceParameters();
}

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

void Dialog::initInterfaceParameters()
{
   
    FaultFindParamsInfo struParams;
    struParams.strBand = "GSM900";
    struParams.fBsPOwer = -45.0;
    struParams.msPower.nPower = 35;
    struParams.msPower.powerLevel = 4;
    struParams.bcchChannel.channel = 63;
    struParams.bcchChannel.rx = 1.5;
    struParams.bcchChannel.tx = 1.5;
    m_pForm1->setValues(struParams);

    FaultFindLimit struLimit;
    struLimit.struPower900.fLevel1 = 3.0;
    struLimit.struPower900.fLevel2 = 4.0;
    struLimit.struPower900.fmax = 2.0;
    struLimit.struPower1800_1900.fLevel1 = 3.0;
    struLimit.struPower1800_1900.fLevel2 = 4.0;
    struLimit.struPower1800_1900.fLevel3 = 5.0;
    struLimit.struPower1800_1900.fmax = 2.0;
    struLimit.nFreqErr900 = 90;
    struLimit.nFreqErr1800_1900 = 180;
    struLimit.nPeakPhase = 20;
    struLimit.fRmsPhase = 5.0;
    struLimit.fBerFer = 2.0;
    m_pForm2->setLimits(struLimit);
}


void Dialog::on_pushButton_clicked()
{
   
    if(!m_pForm2->isHidden()){
   
        m_pForm2->hide();
    }
    m_pForm1->show();
}

void Dialog::on_pushButton_2_clicked()
{
   
    if(!m_pForm1->isHidden()){
   
        m_pForm1->hide();
    }
    m_pForm2->show();
}

form1.h

#ifndef FORM1_H
#define FORM1_H

#include "customlineedit.h"
#include <QWidget>

namespace Ui {
   
class Form1;
}

class Form1 : public QWidget
{
   
    Q_OBJECT

public:
    explicit Form1(QWidget *parent = nullptr);
    ~Form1();
    void setValues(const FaultFindParamsInfo &params);
protected:
    void keyPressEvent(QKeyEvent *event) override;
signals:
    void signWarningOutOfRange(const QString& strPromptText);
private slots:
    void slotUpdateMsPower(const int& nGap,const bool& bIsAdd);
private:
    void initInterface();
    void setLabelDisplayText();
    void setLineEditTextAlignment();
    void setMaxInputCharacter();
    void connectSignalSlot();
    void setLineEditRangeAndType(const QString& strBand);
    void setRange(QVector<FaultFindParamsRange>& rangeVec,const int& nLow,const int& nUp);
    void setLineEditRangeAndTypeByGsm900();
    void setLineEditRangeAndTypeByGsm1800();
    void setLineEditRangeAndTypeByGsm1900();
    void initFormat(QString& strText,const int& digit);
    void saveCtrl();
    void setCurLineEditIsSelected(const bool& bIsSelected);
    CustomLineEdit* curSelectedLineEditByIndex();
    void setEditedTextAfterEditing();
private:
    Ui::Form1 *ui;

    QMap<int,CustomLineEdit*> m_pCustomLineEditMap;
    int m_nCurSelectedIndex;
};

#endif // FORM1_H

form1.cpp

#include "form1.h"
#include "ui_form1.h"

#include <QKeyEvent>

#define SPEECH_BSPOWER_SPEC 1
Form1::Form1(QWidget *parent) :
    QWidget(parent),m_nCurSelectedIndex(0),
    ui(new Ui::Form1)
{
   
    ui->setupUi(this);
    initInterface();
    saveCtrl();
}

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

void Form1::setValues(const FaultFindParamsInfo &params)
{
   
    ui->labelBand->setText(params.strBand);
    QString strChannel = QString::number(params.bcchChannel.channel);
    initFormat(strChannel,4);
    ui->lineEditChannel->setText(strChannel);
    ui->lineEditBsPowerLevel->setText(QString::number(params.fBsPOwer,'f',SPEECH_BSPOWER_SPEC));
    QString strMsPower = QString::number(params.msPower.powerLevel);
    initFormat(strMsPower,2);
    ui->lineEditMsPowerLevel->setText(strMsPower);
    ui->labelPower->setText(QString::number(params.msPower.nPower));
    QString strRx = QString::number(params.bcchChannel.rx,'f',SPEECH_BSPOWER_SPEC);
    initFormat(strRx,5);
    ui->lineEditRX->setText(strRx);
    QString strTx = QString::number(params.bcchChannel.tx,'f',SPEECH_BSPOWER_SPEC);
    initFormat(strTx,5);
    ui->lineEditTX->setText(strTx);

    setLineEditRangeAndType(params.strBand);

    ui->lineEditChannel->setSelected(true,ui->lineEditChannel->text().length());
}

void Form1::keyPressEvent(QKeyEvent *event)
{
   
    if(event->key() == Qt::Key_Up){
   
        setEditedTextAfterEditing();
        setCurLineEditIsSelected(false);
        if(m_nCurSelectedIndex > 0){
   
            m_nCurSelectedIndex -= 1;
        }else{
   
            m_nCurSelectedIndex = m_pCustomLineEditMap.lastKey();
        }
        setCurLineEditIsSelected(true);
    }else if(event->key() == Qt::Key_Down){
   
        setEditedTextAfterEditing();
        setCurLineEditIsSelected(false);
        if(m_nCurSelectedIndex < m_pCustomLineEditMap.lastKey()){
   
            m_nCurSelectedIndex += 1;
        }else{
   
            m_nCurSelectedIndex = 0;
        }
        setCurLineEditIsSelected(true);
    }else{
   
        QWidget::keyPressEvent(event);
    }
}

void Form1::slotUpdateMsPower(const int& nGap,const bool& bIsAdd)
{
   
    QString strMsPower = ui->labelPower->text();
    int nStep = 2 * nGap;
    int nPower;
    if(bIsAdd){
   
        nPower = strMsPower.toInt() + nStep;
    }else{
   
        nPower = strMsPower.toInt() - nStep;
    }

    ui->labelPower->setText(QString::number(nPower)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贺!伊克罗德携手九科信息共同发布RPA+AI智能机器人解决方案「ECRobot」

12月12日&#xff0c;伊克罗德信息在上海举办 “创见AI&#xff0c;迈进智能化未来——科技赋能零售电商”活动&#xff0c;与九科信息、亚马逊云科技共同探讨与分享融合生成式AI技术和智能自动化&#xff08;RPA&#xff0c;Robotic Process Automation&#xff09;在电商零售…

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

【每日刷题】Day169

【每日刷题】Day169 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; 2. 2269. 找到一个数字的 K 美丽值…

国科大智能设备安全-APK逆向分析实验

APK逆向分析实验 使用APK常用逆向分析工具&#xff0c;对提供的移动应用程序APK文件进行逆向分析&#xff0c;提交逆向后代码和分析报告。具体任务如下&#xff1a; 任务一&#xff1a;安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法&#xff0c;对提供的Facebook Updat…

医学图像分割数据集腹部肝脏多器官图像分割数据集labelme格式860张10类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;860 标注数量(json文件个数)&#xff1a;860 标注类别数&#xff1a;10 标注类别名称:["liver","stomach","o…

EasyExcel设置表头上面的那种大标题(前端传递来的大标题)

1、首先得先引用easyExcel的版本依赖&#xff0c;我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的实体类&#xff0c;&…

数据仓库-集群管理

主要介绍操作类问题中的集群管理问题。 无法成功创建数据仓库集群时怎么处理&#xff1f; 请检查用户账户余额是否少于100元&#xff0c;是否已经没有配额创建新的数据仓库集群&#xff0c;以及是否存在网络问题。 如账户余额、配额、网络均未发现问题&#xff0c;请联系客户…

双目摄像头标定方法

打开matlab 找到这个标定 将双目左右目拍的图像上传&#xff08;左右目最好不少于20张&#xff09; 等待即可 此时已经完成标定&#xff0c;左下角为反投影误差&#xff0c;右边为外参可视化 把这些误差大的删除即可。 点击导出 此时回到主页面&#xff0c;即可看到成功导出 Ca…

python学opencv|读取图像(七)抓取像素数据顺利修改图像大小

【1】引言 前序我们已经学习图像的基本读取操作&#xff0c;文章链接为&#xff1a; python学opencv|读取图像-CSDN博客 也掌握了彩色图像的保存&#xff1a; python学opencv|读取图像&#xff08;二&#xff09;保存彩色图像_python opencv 读取图像转为彩色-CSDN博客 以…

【论文阅读笔记】One Diffusion to Generate Them All

One Diffusion to Generate Them All 介绍理解 引言二、相关工作三、方法预备知识训练推理实现细节训练细节 数据集构建实验分结论附录 介绍 Paper&#xff1a;https://arxiv.org/abs/2411.16318 Code&#xff1a;https://github.com/lehduong/onediffusion Authors&#xff1…

【橘子容器】如何构建一个docker镜像

你肯定打过docker镜像是吧&#xff0c;作为一个开发这很正常&#xff0c;那么你用的什么打包方式呢&#xff0c;这里我们来梳理几种常用的docker镜像构建方式。 ps&#xff1a;这里不是太讲原理&#xff0c;更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…

神经网络基础-激活函数

文章目录 1. 什么是激活函数2. sigmoid 激活函数3. tanh 激活函数4. ReLU 激活函数5. SoftMax 激活函数6. 其他常见的激活函数7. 激活函数的选择方法 1. 什么是激活函数 激活函数用于对每层的输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种…

开源低代码平台-Microi吾码-平台简介

Microi吾码-平台介绍 开源低代码平台-Microi吾码-平台简介预览图平台亮点版本区别成功案例源码目录说明Microi吾码 - 系列文档 开源低代码平台-Microi吾码-平台简介 技术框架&#xff1a;.NET8 Redis MySql/SqlServer/Oracle Vue2/3 Element-UI/Element-Plus平台始于2014年…

Rust之抽空学习系列(三)—— 编程通用概念(中)

Rust之抽空学习系列&#xff08;三&#xff09;—— 编程通用概念&#xff08;中&#xff09; 1、变量&可变性 在Rust中&#xff0c;变量默认是不可变的 fn main() {let x 5;println!("x is {}", x); }使用let来声明一个变量&#xff0c;此时变量默认是不可变…

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决&#xff0c;一是同步化供应链消减从需求到供应的放大效应&#xff0c;二是供应链细分&#xff0c;针对不同的客户、不同的需求供应的匹配策略来应对复杂性&#xff0c;更好的满足客户并以最低的总成本来实现。 对…

多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)

文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要&#xff0c;一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…

可视化报表如何制作?一文详解如何用报表工具开发可视化报表

在如今这个数据驱动的商业时代&#xff0c;众多企业正如火如荼地推进数字化转型&#xff0c;力求在激烈的市场竞争中占据先机。然而&#xff0c;随着业务规模的扩大和运营复杂度的提升&#xff0c;企业的数据量爆炸式增长&#xff0c;传统报表格式单一、信息呈现密集且不易解读…

基于XML配置Bean和基于XML自动装配

目录 基于XML配置Bean id分配规则 通过id获取bean 通过类型获取bean 通过C命名空间配置bean 使用C命名空间 通过P命名空间配置bean 通过util:list进行配置bean 指定id&#xff0c;直接ref引用过来 通过外部属性文件配置Bean Bean信息重用&#xff08;继承&#xff09;…

(九)机器学习 - 多项式回归

多项式回归&#xff08;Polynomial Regression&#xff09;是一种回归分析方法&#xff0c;它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数&#xff0c;使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…

Leetcode 每日一题9.回文数

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是:回文数的解法 目录 ​编辑 问题描述 输入输出格式 示例 约束条件 进阶挑战 解决方案 问题分析 过题图片 字符串转换法 数学方法 算法解释 题目链接 结论 问题描述 给定一个整数 x&#xff0c;我们需要…