QT自定义控件-经纬度输入框
原文
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自定义控件-经纬度输入框相关推荐
- QT自定义控件--键盘输入框
一.效果展示 二.原理详解 这个键盘不是标准的键盘,而是个人项目中定制化的键盘控件,这个控件属于组合控件,不是通过QPinter绘制的,而是通过Qt自带的类相互结合自定义的控件.键盘采用QPushBu ...
- Qt自定义控件(IP输入框,windows下)
1.建立自定义控件项目 组代表后来能从哪里找到 剩下的点"下一步"就行了 2.编辑代码 在生成项目的cpp中添加自己的内容(没有.ui界面了,设计tab是灰色的) 放一下我的代码 ...
- linux qt 自定义控件,编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件...
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:"升级(promo ...
- Qt自定义控件创建和使用
Qt自定义控件创建和使用 Qt中很方便的是使用各种自定义控件来分模块实现各种子功能,用于实现代码的解耦: 之前在使用Qt 5.12创建自定义控件时,出现了各种问题,多次重装QtCreator和VS,屡 ...
- Qt QLineEdit单行输入框用法详解
Qt QLineEdit单行输入框用法详解 QLineEdit 是 Qt 提供的一个控件类,它直接继承自 QWdiget 类,专门用来创建单行输入框,如下图所示: 图 1 单行文本输入框 实际开发中, ...
- Qt自定义控件之仪表盘的完整实现
概述 基于QT的仪表盘有很多种办法,比如使用QWT,ChartDirector 或H5混合的echart组件,或者基于QT的绘图功能绘制,或者基于美工提供的图片的基础上增加动态效果.然而搞明白QT自定 ...
- Qt自定义控件------SwitchButton
简介 一般用来两种互斥状态的切换. 效果 下面放效果图 控件拆分 一.控件大体有两部分组成,一个是背景,一个是白色的滑块.原本背景是想用QWidget然后直接设置圆角的,然后发现效果很差.所以背景 ...
- 【Qt开发笔记】Qt自定义控件开发与使用,自定义控件实现容器与控件内布局
1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 创建一个Qt自定义控件工程. 工程名为Custom. 控件类取名Custom. 然后完成创 ...
- Qt自定义控件之圆形按钮、圆形头像
Qt自定义控件之圆形按钮.圆形头像 前言 代码实现 实验效果 前言 现在很多软件的头像或者按钮都是圆形了,看起来比较舒服.比如QQ登录头像,酷狗客户端的一些按钮都是圆形.Qt实现圆形头像,大致有几种思 ...
- Qt 自定义控件提升,头文件找不到的问题
Qt 自定义控件提升,头文件找不到的问题 在附加包含目录添加: ./
最新文章
- 由一行文本输入框引发的思考
- python鼠标键盘操作 PyUserInput
- JAVA中“==”与equals()方法区别
- linux 日志按大小切割_日志切割工具logrotate,帮你管理你的日志文件
- liferay6.2导出excel
- 一般处理程序读写session
- vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
- 计算器计算经纬距离_经纬度距离角度计算工具
- OSPF路由协议基础(OSPF基本配置)
- windows下安装phpcms html/ 文件夹不可写的一种错误以及解决方法
- RuntimeError: all elements of input should be between 0 and 1
- 18.11 LVS DR模式搭建
- 某LINUX平台,管道open直接崩溃
- 人工智能—— 产生式表示法
- python turtle 绘图小猪佩奇_python海龟作图完成小猪佩奇
- 优麒麟服务器配置备忘
- 智慧政务行业发展报告
- 【Java】公式计算 | JEXL
- python 动漫卡通人物图片大全,『TensorFlow』DCGAN生成动漫人物头像_下
- JSON数据和html表格的互相转换