原文

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);
}

QT自定义控件-经纬度输入框相关推荐

  1. QT自定义控件--键盘输入框

    一.效果展示 二.原理详解 这个键盘不是标准的键盘,而是个人项目中定制化的键盘控件,这个控件属于组合控件,不是通过QPinter绘制的,而是通过Qt自带的类相互结合自定义的控件.键盘采用QPushBu ...

  2. Qt自定义控件(IP输入框,windows下)

    1.建立自定义控件项目 组代表后来能从哪里找到 剩下的点"下一步"就行了 2.编辑代码 在生成项目的cpp中添加自己的内容(没有.ui界面了,设计tab是灰色的) 放一下我的代码 ...

  3. linux qt 自定义控件,编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件...

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:"升级(promo ...

  4. Qt自定义控件创建和使用

    Qt自定义控件创建和使用 Qt中很方便的是使用各种自定义控件来分模块实现各种子功能,用于实现代码的解耦: 之前在使用Qt 5.12创建自定义控件时,出现了各种问题,多次重装QtCreator和VS,屡 ...

  5. Qt QLineEdit单行输入框用法详解

    Qt QLineEdit单行输入框用法详解 QLineEdit 是 Qt 提供的一个控件类,它直接继承自 QWdiget 类,专门用来创建单行输入框,如下图所示: 图 1 单行文本输入框 实际开发中, ...

  6. Qt自定义控件之仪表盘的完整实现

    概述 基于QT的仪表盘有很多种办法,比如使用QWT,ChartDirector 或H5混合的echart组件,或者基于QT的绘图功能绘制,或者基于美工提供的图片的基础上增加动态效果.然而搞明白QT自定 ...

  7. Qt自定义控件------SwitchButton

    简介   一般用来两种互斥状态的切换. 效果 下面放效果图 控件拆分 一.控件大体有两部分组成,一个是背景,一个是白色的滑块.原本背景是想用QWidget然后直接设置圆角的,然后发现效果很差.所以背景 ...

  8. 【Qt开发笔记】Qt自定义控件开发与使用,自定义控件实现容器与控件内布局

    1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 创建一个Qt自定义控件工程. 工程名为Custom. 控件类取名Custom. 然后完成创 ...

  9. Qt自定义控件之圆形按钮、圆形头像

    Qt自定义控件之圆形按钮.圆形头像 前言 代码实现 实验效果 前言 现在很多软件的头像或者按钮都是圆形了,看起来比较舒服.比如QQ登录头像,酷狗客户端的一些按钮都是圆形.Qt实现圆形头像,大致有几种思 ...

  10. Qt 自定义控件提升,头文件找不到的问题

    Qt 自定义控件提升,头文件找不到的问题 在附加包含目录添加: ./

最新文章

  1. 由一行文本输入框引发的思考
  2. python鼠标键盘操作 PyUserInput
  3. JAVA中“==”与equals()方法区别
  4. linux 日志按大小切割_日志切割工具logrotate,帮你管理你的日志文件
  5. liferay6.2导出excel
  6. 一般处理程序读写session
  7. vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
  8. 计算器计算经纬距离_经纬度距离角度计算工具
  9. OSPF路由协议基础(OSPF基本配置)
  10. windows下安装phpcms html/ 文件夹不可写的一种错误以及解决方法
  11. RuntimeError: all elements of input should be between 0 and 1
  12. 18.11 LVS DR模式搭建
  13. 某LINUX平台,管道open直接崩溃
  14. 人工智能—— 产生式表示法
  15. python turtle 绘图小猪佩奇_python海龟作图完成小猪佩奇
  16. 优麒麟服务器配置备忘
  17. 智慧政务行业发展报告
  18. 【Java】公式计算 | JEXL
  19. python 动漫卡通人物图片大全,『TensorFlow』DCGAN生成动漫人物头像_下
  20. JSON数据和html表格的互相转换

热门文章

  1. 忘记Mac开机密码处理方法
  2. cmd 查找文件路径
  3. Linux Stress测压工具安装与使用详解
  4. 心力哲学——艰难多变环境下快乐、自由与生存力的源泉(二)
  5. 【AutoSec 汽车安全直播课】:整车网络安全威胁分析与风险评估(TARA)方法与实践
  6. 算法设计与分析-递归与卡特兰数
  7. 接口(interface、implement)
  8. 二极管和三极管介绍-二极管和三极管的区别及工作原理详解-KIA MOS管
  9. ffmpeg压制视频命令及常用转码参数解析
  10. umts是移动还是联通_WCDMA/GSM是什么意思 是电信移动还是联通