Qt实现自定义行编辑器

news2025/3/1 10:34:49

引言

  • 开发环境
  • 项目结构
  • 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)

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

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

相关文章

企业级日志分析系统ELK之ELK概述

ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件&#xff0c;如果应用出现问题&#xff0c;开发和运维人员想排 查原因&#xff0c;就要先找到相应的主机上的日志文件再进行查找和分析&#xff0c;所以非常不方便&#xff0c;而且还涉及…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…

每日一站技術架構解析之-cc手機桌布網

# 網站技術架構解析&#xff1a; ## 一、整體架構概述https://tw.ccwallpaper.com是一個提供手機壁紙、桌布免費下載的網站&#xff0c;其技術架構設計旨在實現高效的圖片資源管理與用戶訪問體驗優化。 ### &#xff08;一&#xff09;前端展示 1. **HTML/CSS/JavaScript基礎構…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…

Mybatis -plus -jion的复习

Mybatis -plus -jion 是一个 MyBatis-Plus 的增强工具&#xff0c;在 MyBatis-Plus 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 - **无侵入**&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 - **损耗小…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Qt之自定义动态调控是否显示日志

创作灵感 最近在芯驰x9hp上开发仪表应用。由于需要仪表警告音&#xff0c;所以在该平台上折腾并且调试仪表声音的时候&#xff0c;无意间发现使用&#xff1a; export QT_DEBUG_PLUGINS1 可以打印更详细的调试信息。于是想着自己开发的应用也可以这样搞&#xff0c;这样更方便…

右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统

一、项目名称 山西右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统 二、项目背景&#xff1a; 山西右玉光伏发电项目位于右玉县境内&#xff0c;总装机容量为200MW&#xff0c;即太阳能电池阵列共由200个1MW多晶硅电池阵列子方阵组成&#xff0c;每个子方阵包含太阳能…

Java基础学习:java常用启动命令

一、java -jar 1、系统属性传递 使用形式&#xff1a;java -DpathD:\jacoco -jar 获取方式&#xff1a;System.getProperties() 2、系统参数传递 使用形式&#xff1a;java -jar application.jar --jacocoPathD:\tomcat 获取方式&#xff1a;通过启动方法入口main的参数arg…

一级考试真题(2019)

一级考试真题&#xff08;2019&#xff09;

echarts图表自定义配置(二)——代码封装

下图是初版&#xff0c;火山图的代码。可以看出&#xff0c;里面的变量&#xff0c;逻辑&#xff0c;函数存在冗余&#xff0c;基本上都是改了参数&#xff0c;同样的get和set&#xff0c;去刷新图表&#xff1b;对于往后继续开发十几二十个图表&#xff0c;会很麻烦。因此需要…

如何用状态图进行设计05

到目前为止&#xff0c;我们已经讨论了状态图的原理。这些原理对状态图和扩展状态图都适用。第二章后面的部分主要讲述了扩展状态图的扩展功能。我们将围绕这些增强的功能&#xff0c;使你对BetterState Pro的设计能力有很好的了解。 关于这些内容和其他有关扩展状态图特性的完…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中&#xff0c;九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖&#xff0c;用户可以随机获得不同奖品&#xff0c;增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能&#xff0c;并通过代码解析展示实现细节。 【环境准…

【efinance一个2k星的库】

efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库&#xff0c;回测以及量化交易的好帮手 但没有等比复权的&#xff0c;不用。 import efinance as ef ef.stock.get_quote_history(510880,fqt2)

协同办公软件新升级:细节优化,让办公更简单

细节决定成败&#xff0c;企业酷信协同办公系统通过贴近客户实际需求的一系列改进和创新&#xff0c;在技术架构、系统结构、管理理念和使用性能上&#xff0c;都达到了国内先进水平&#xff0c;同时具备独特的优势。让我们看看企业酷信是如何通过这些细节提升&#xff0c;为企…

【AI知识】有监督学习分类任务之支持向量机

1.支持向量机概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 是一种有监督学习算法&#xff0c;主要用于分类任务&#xff08;也可用于回归任务&#xff0c;即支持向量回归&#xff0c;SVR&#xff09;。SVM的核心思想是找到一个最优的超平面&#xff0…

MySQL有哪些高可用方案?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助&#xff1b; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率&#xff0c;也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像&#xff0c;采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…

threejs——无人机概念切割效果

主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…

我的AI工具箱Tauri版-SpiderYtDlp油管视频多功能下载

本教程基于自研的AI工具箱Tauri版进行SpiderYtDlp油管视频多功能下载。 SpiderYtDlp油管视频多功能下载 是一款基于自研AI工具箱的全新解决方案&#xff0c;专为满足多场景需求的用户设计。工具集成了便捷的链接直接下载功能和强大的关键词模糊搜索下载功能&#xff0c;赋能创…