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

it2025-06-05  8

原文

CoordinateEdit.h

#pragma once #include <QWidget> #include <QEvent> class QLineEdit; class QLabel; class CoordinateEdit : public QWidget { Q_OBJECT public: 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); }
最新回复(0)