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_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic: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_OBJECTpublic: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)

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

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

相关文章

得物使用AutoMQ构建海量数据处理的新一代可观测性架构

引言 得物作为全球领先的潮流网购社区&#xff0c;日益增长的用户和数据带来了巨大的技术挑战。当前&#xff0c;得物的可观测性平台每天生成数PB级Trace数据和数万亿条Span记录&#xff0c;要求平台具备高效的实时处理能力和低成本的数据存储解决方案。 传统的存算一体架构将…

视图、转发与重定向、静态资源处理

目录 视图 默认视图 视图机制原理 自定义视图 请求转发与重定向 静态资源处理 视图 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性 可以通过 order 属性指定解析器的优先顺序&#xff0c;order 越小优先级越高 默认是最低优先级&#xff0c;Integer.MAX_…

Redis 生产问题(重要)

缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&#xf…

【Redis】壹 —— Redis 介绍

文章目录&#xff1a; 前言 一、认识Redis 1. Redis 用途 作为数据库 作为流引擎 二、服务端高并发分布式结构演变 1. 单机架构 2. 应用数据分离架构 3. 应用服务集群架构 4. 读写分离 / 主从分离架构 5. 冷热分离 —— 引入缓存 6. 分库分表 7. 微服务架构 8. …

auto-gptq安装以及不适配软硬件环境可能出现的问题及解决方式

目录 1、auto-gptq是什么&#xff1f;2、auto-gptq安装3、auto-gptq不正确安装可能会出现的问题&#xff08;1&#xff09;爆出&#xff1a;CUDA extension not installed.&#xff08;2&#xff09;没有报错但是推理速度超级慢 1、auto-gptq是什么&#xff1f; Auto-GPTQ 是一…

AI 的时代,新科技和新技术如何推动跨学科的整合?

在当前AI的发展中&#xff0c;我们面临的一个主要挑战就是融合的问题&#xff0c;这实际上不仅是技术上的融合&#xff0c;还有更深层次的哲学层面的思考。 或许在中国这方面的讨论较少&#xff0c;但在西方哲学和神学的语境中&#xff0c;探讨万物的根本和不同学科之间的联系…

【h5py】 提取mat文件中的HDF5格式的数据

h5py 提取mat文件中的HDF5格式的数据 使用纯Python查看数据配合Matlab后&#xff0c;使用Python查看数据 一、使用纯Python查看文件数据内容 原理&#xff1a;当HDF5存储的是struct类型数据&#xff0c;解析时要像一棵树&#xff0c;我们需要逐层次的去解析&#xff0c;直到…

【指南】03 CSC联系外导

确定外导 课题组有合作关系的国外导师与自己研究方向密切相关的国外导师国外高校官网、谷歌学术、Research Gate等平台检索不可以是中国港澳台的高校科研院所或机构注意外导所在高校排名和科研水平可列表记录注意外国签证政策 发送邮件 自我介绍简要介绍CSC介绍自己的研究对…

DOM与BOM试题

基础回顾题(48分,1分1道题) querySelector 基础 写出一段代码&#xff0c;使用querySelector选择页面上第一个<button>元素&#xff0c;并打印该元素到控制台。 querySelectorAll 基础 使用querySelectorAll选择所有类名为item的元素&#xff0c;并打印这些元素组成的N…

20.LMAX——DDD的极致性能架构

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 历史起源架构目标架构要素 时序对比传统时序事件溯源时序LMAX时序 单线程非阻塞异步IO&#xff08;reactor&#xff09;多线程单…

MFC集成WebBrowser控件的实例教程

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文提供了如何在MFC应用程序中集成WebBrowser控件的详细步骤&#xff0c;该控件利用ActiveX技术实现内嵌IE浏览器引擎功能。读者将学习如何创建对话框、处理控件事件&#xff0c;并添加导航功能以实现网页浏览。…

解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

文章目录 解决&#xff1a;IDEA中Autowired自动注入MyBatis Mapper报红警告的几种解决方法问题描述&#xff1a;解决办法&#xff1a;1.将Autowired注解改成Resource2.给Autowired(required false)设置属性3.给Mapper层加注解Mapper/Repository4.改变写法,用RequiredArgsConst…

python 调Qt C++ 写法配置和坑点

python 示例写法 和调c动态库一样 通过回调函数方式 将python函数注册到c 动态库中 from ctypes import *def DllCall(nParam, nFlag):print(nParam, nFlag)z2 0.6z3 0.4z4 0.0z5 0.3z6 0.5z7 0.8z8 0.3z9 0.9strData str(z2) str(z3) str(z4) str(z5)…

在Docker中运行MySQL的思考:挑战与解决方案

引言 在云计算和容器化技术日益普及的今天&#xff0c;Docker作为一种轻量级的容器化平台&#xff0c;已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而&#xff0c;并非所有应用都适合在Docker容器中…

Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

Navicat for MySQL 查主键、表字段类型、索引

针对Navicat 版本11 &#xff0c;不同版本查询方式可能不同 1、主键查询 &#xff08;重点找DDL&#xff01;&#xff01;&#xff01;&#xff09; 方法&#xff08;1&#xff09; &#xff1a;右键 - 对象信息 - 选择要查的表 - DDL - PRIMARY KEY 方法&#xff08;2&…

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 总体感觉偏简单&#xff0c;但是知识点记得不牢&#xff0c;估计机会不大。 今日 12.11 &#xff0c;成绩已出&#xff0c;每科总分 75分&#xff0c;全部45分以上为通过。 成绩总…

angular图表echarts设置

angular框架ngx-echarts图表的配置 图表高度设置 默认高度是400px 可以自己动态设置容器高度 <div echarts nz-row nzJustify"start" [options]"option" [style.height]"option.echartHeight"></div>option.echartHeight‘600px’…

springboot402航班进出港管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统航班进出港管理系统信息管理难度大&#xff0c;容错率低…

umi实现动态获取菜单权限

文章目录 前景登录组件编写登录逻辑菜单的时机动态路由页面刷新手动修改地址 前景 不同用户拥有不同的菜单权限&#xff0c;现在我们实现登录动态获取权限菜单。 登录组件编写 //当我们需要使用dva的dispatch函数时&#xff0c;除了通过connect函数包裹组件还可以使用这种方…