失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > QT自定义控件-经纬度输入框

QT自定义控件-经纬度输入框

时间:2023-07-20 09:08:53

相关推荐

QT自定义控件-经纬度输入框

原文

CoordinateEdit.h

#pragma once#include <QWidget>#include <QEvent>class QLineEdit;class QLabel;class CoordinateEdit : public QWidget{Q_OBJECTpublic:enum Type{Type_Longitude,Type_Lagitude};CoordinateEdit(Type type = Type_Longitude,QWidget *parent = 0);~CoordinateEdit();void SetType(Type type){m_type = type; }QString GetCoordinate() {return m_coordinate; }QString GetDegree() {return m_d; }QString GetMinute() {return m_m; }QString GetSecond() {return m_s + "." + m_ms; }protected:bool eventFilter(QObject *watched, QEvent *event);signals:void coordChange(const QString &);private slots:void OnLineEdit(const QString& text);private:Type m_type;QLineEdit* m_degree;QLineEdit* m_minute;QLineEdit* m_second;QLineEdit* m_msec;QLabel* m_dLab;QLabel* m_mLab;QLabel* m_sLab;QString m_coordinate;QString m_d;QString m_m;QString m_s;QString m_ms;};

CoordinateEdit.cpp

#include "CoordinateEdit.h"#include <QLineEdit>#include <QLabel>#include <QHBoxLayout>#include <QRegExp>#include <QRegExpValidator>#include <QKeyEvent>CoordinateEdit::CoordinateEdit(Type type,QWidget *parent): QWidget(parent), m_type(type){if (parent){parent->setLayout(new QHBoxLayout);parent->layout()->addWidget(this);}m_degree = new QLineEdit;m_degree->setObjectName("Degree");m_degree->setAlignment(Qt::AlignCenter);m_degree->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);m_minute = new QLineEdit;m_minute->setObjectName("Minute");m_minute->setAlignment(Qt::AlignCenter);m_minute->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);m_second = new QLineEdit;m_second->setObjectName("Second");m_second->setAlignment(Qt::AlignCenter);m_second->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);m_msec = new QLineEdit;m_msec->setObjectName("Msec");m_msec->setAlignment(Qt::AlignCenter);m_msec->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);connect(m_degree, &QLineEdit::textEdited, this, &CoordinateEdit::OnLineEdit);connect(m_minute, &QLineEdit::textEdited, this, &CoordinateEdit::OnLineEdit);connect(m_second, &QLineEdit::textEdited, this, &CoordinateEdit::OnLineEdit);connect(m_msec, &QLineEdit::textEdited, this, &CoordinateEdit::OnLineEdit);m_dLab = new QLabel(QStringLiteral("°"));m_mLab = new QLabel(QStringLiteral("′"));m_sLab = new QLabel(QStringLiteral("″"));QHBoxLayout *blay = new QHBoxLayout(this);blay->addWidget(m_degree);blay->addWidget(m_dLab);blay->addWidget(m_minute);blay->addWidget(m_mLab);blay->addWidget(m_second);blay->addWidget(m_sLab);blay->addWidget(m_msec);blay->setMargin(0);blay->setSpacing(0);this->setStyleSheet("QWidget{background:white;color:black;border:1px solid white;}\QLabel{border:0px;}\QLineEdit#Degree{border-right:0px;border-top-left-radius:10px;border-bottom-left-radius:10px;}\QLineEdit#Minute{boder-left:0px;border-right:0px;}\QLineEdit#Second{boder-left:0px;border-right:0px;}\QLineEdit#Msec{border-left:0px;border-top-right-radius:10px;border-bottom-right,-radius:10px;}");if (m_type == Type_Longitude){QRegExp dreg("(([-]?[0-9])|([-]?[2-9][0-9])|([-]?[1]([0-7])[0-9]))");QRegExpValidator *dvalidator = new QRegExpValidator(dreg, this);m_degree->setValidator(dvalidator);}else if (m_type == Type_Lagitude){QRegExp dreg("(([-]?[0-9])|([-]?[1-8][0-9]))");QRegExpValidator *dvalidator = new QRegExpValidator(dreg, this);m_degree->setValidator(dvalidator);}QRegExp mreg("(([0-9])|([1-5][0-9]))");QRegExpValidator *mvalidator = new QRegExpValidator(mreg, this);m_minute->setValidator(mvalidator);m_second->setValidator(mvalidator);QRegExp msreg("(([0-9])|([0-9][0-9])|([0-9][0-9][0-9]))");QRegExpValidator *msvalidator = new QRegExpValidator(msreg, this);m_msec->setValidator(msvalidator);m_degree->installEventFilter(this);m_minute->installEventFilter(this);m_second->installEventFilter(this);m_msec->installEventFilter(this);}CoordinateEdit::~CoordinateEdit(){}bool CoordinateEdit::eventFilter(QObject *watched, QEvent *event){if (event->type() == QEvent::KeyPress){QLineEdit *edit = (QLineEdit*)watched;if (edit == m_degree || edit == m_minute || edit == m_second || edit == m_msec){QKeyEvent *key = (QKeyEvent *)event;if (key->key() == Qt::Key_Backspace) {if (edit->text().length() <= 1) {this->focusNextPrevChild(false);}}}}return QWidget::eventFilter(watched, event);}void CoordinateEdit::OnLineEdit(const QString& text){QLineEdit* edit = (QLineEdit*)sender();int len = text.length();int value = text.toInt();if (m_type == Type_Longitude) {if (edit == m_degree){if (value > 0 && len == 3)this->focusNextChild();else if (value < 0 && len == 4)this->focusNextChild();}else if (edit == m_msec) {if (len == 3)this->focusNextChild();}else {if (len == 2)this->focusNextChild();}}else{if (edit == m_degree){if (value > 0 && len == 2)this->focusNextChild();else if (value < 0 && len == 3)this->focusNextChild();}else if (edit == m_msec) {if (len == 3)this->focusNextChild();}else {if (len == 2)this->focusNextChild();}}m_coordinate = QString(QStringLiteral("%1°%2′%3″%4")).arg(m_degree->text()).arg(m_minute->text()).arg(m_second->text()).arg(m_msec->text());m_d = m_degree->text();m_m = m_minute->text();m_s = m_second->text();m_ms = m_msec->text();emit coordChange(m_coordinate);}

如果觉得《QT自定义控件-经纬度输入框》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。