Qt实现自定义行编辑器

news/2024/12/19 19:01:08/

引言

  • 开发环境
  • 项目结构
  • 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.ppmy.cn/news/1556455.html

相关文章

数据结构强化篇

文章目录 1.快速排序2.划分思想3.二路归并4.链表1>使用计数器统计链表的长度2>按照关键字条件查找删除3>按照关键字条件查找插入 5.头插法&#xff08;原地逆置&#xff09;6.尾插法&#xff08;保持原序&#xff09;7.二叉树1>前/中/后序遍历2>层序遍历3>求…

R语言函数简介

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 R语言中的函数&#xff08;function&#xff09;是一…

前端成长之路:HTML(4)

前文提到&#xff0c;在HTML中&#xff0c;表格是为了展示数据&#xff0c;表单是为了提交数据。表单标签是十分重要的标签&#xff0c;在网页中&#xff0c;需要和用户进行交互&#xff0c;收集用户信息等&#xff0c;此时就需要使用表单。表单可以将前端收集到的用户输入的信…

Flutter-Web首次加载时添加动画

前言 现在web上线后首次加载会很慢&#xff0c;要5秒以上&#xff0c;并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.找到web/index.html文件 2.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;…

Linux-设备树

一、设备树 设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(Device Tree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU 数量、 内存基地址、I…

MySQL 实战:小型项目中的数据库应用(二)

小型项目里 MySQL 的安全与性能管理 用户权限管理 在小型项目中&#xff0c;合理的用户权限管理对于保障 MySQL 数据库的安全性至关重要。MySQL 的权限系统有着细致的层级划分和丰富的权限类型&#xff0c;能让管理员精确控制不同用户对数据库的访问与操作能力。 首先是权限…

智能算法驱动:中阳科技量化交易模型的革新之路

在金融智能化和自动化浪潮中&#xff0c;中阳科技率先以量化交易模型为核心&#xff0c;构建高效的投资生态&#xff0c;成为智能交易领域的领导者。本文将深入剖析中阳科技在模型设计、数据整合、技术创新以及未来发展策略中的核心优势&#xff0c;为读者展示其领先的技术应用…

基于 Spring Boot + Vue 的宠物领养系统设计与实现

引言 近年来&#xff0c;随着人们生活水平的提高&#xff0c;宠物逐渐成为许多家庭的重要成员。然而&#xff0c;宠物的流浪和弃养问题日益严重&#xff0c;这促使社会对宠物领养的需求不断增长。为解决宠物领养中信息不对称、领养流程复杂等问题&#xff0c;设计并实现一个基…