Qt实现自定义行编辑器


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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值