You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/CFDStruct/CUIProperty/CUILineEdit.cpp

222 lines
5.6 KiB
C++

#include "CUILineEdit.h"
#include <QHBoxLayout>
#include<CUIConfig.h>
#include<QLabel>
#include<CUI.h>
#include<QDebug>
/**
* @brief CUILineEdit::CUILineEdit 构造函数
* @param conf 配置信息
* @param parent
*/
CUILineEdit::CUILineEdit(CUIConfig* conf, QVector<CUI*> &subCUI,QWidget *parent) : QWidget(parent)
{
this->conf = conf;
appSetting();
iniUI(subCUI);
showMsg();
checkRange();
}
/**
* @brief CUILineEdit::isInRange 判断是否在设置范围内,根据不同的类型进行相应的判断
* @return true\false 是否在范围内
*/
bool CUILineEdit::isInRange() const
{
bool res = false;
if(check_range_){
if(data_type == "int")
{
if(inclusive_){
res = range_min_.toInt() <= lineedit->text().toInt() &&
lineedit->text().toInt() <= range_max_.toInt();
}else{
res = range_min_.toInt() < lineedit->text().toInt() &&
lineedit->text().toInt() < range_max_.toInt();
}
}
if(data_type == "double")
{
if(inclusive_){
res = range_min_.toDouble() <= lineedit->text().toDouble() &&
lineedit->text().toDouble() <= range_max_.toDouble();
}else{
res = range_min_.toDouble() < lineedit->text().toDouble() &&
lineedit->text().toDouble() < range_max_.toDouble();
}
}
}
return res;
}
/**
* @brief CUILineEdit::getLabelWidth 获取当前组件的label的最小宽度
* @return label的最小宽度
*/
qint32 CUILineEdit::getLabelWidth()
{
return label->minimumSizeHint().width();
}
/**
* @brief CUILineEdit::setLabelWidth 设置label的宽度
* @param width 宽度
*/
void CUILineEdit::setLabelWidth(qint32 width)
{
label->setMinimumWidth(width);
}
/**
* @brief CUILineEdit::iniUI 根据配置信息初始化
*/
void CUILineEdit::iniUI(QVector<CUI*> &subCUI)
{
layout = new QHBoxLayout();
label = new QLabel(conf->getPropertyValue("name"));
lineedit = new QLineEdit(initial_value_);
layout->addWidget(label);
layout->addWidget(lineedit);
this->setLayout(layout);
connect(lineedit, &QLineEdit::textEdited, this, &CUILineEdit::onTextChanged);
}
/**
* @brief CUILineEdit::appSetting 读取配置信息,并将配置信息存储到定义变量中
*/
void CUILineEdit::appSetting()
{
data_type = conf->getPropertyValue("data_type");
initial_value_ = conf->getPropertyValue("initial_value_");
qDebug()<< initial_value_;
if(data_type == "string"){
check_range_ = 0;
}
if(data_type == "int"){
if(conf->getPropertyValue("check_range_") == "true")
{
check_range_ = true;
range_min_ = conf->getPropertyValue("range_min_").toInt();
range_max_ = conf->getPropertyValue("range_max_").toInt();
if(conf->getPropertyValue("inclusive_") == "true")
inclusive_ = true;
else
inclusive_ = false;
}else{
check_range_ = false;
}
}
if(data_type == "double"){
if(conf->getPropertyValue("check_range_") == "true"){
check_range_ = true;
range_min_ = conf->getPropertyValue("range_min_").toDouble();
range_max_ = conf->getPropertyValue("range_max_").toDouble();
if(conf->getPropertyValue("inclusive_") == "true")
inclusive_ = true;
else
inclusive_ = false;
}else{
check_range_ = false;
}
}
if(conf->getPropertyValue("required_") == "false")
required_ = false;
else
required_ = true;
}
/**
* @brief CUILineEdit::checkType 检查类型,并修改
*/
void CUILineEdit::checkType(const QString &text)
{
qint32 cursorPosition = lineedit->cursorPosition();
if(data_type == "int"){
bool ok;
text.toInt(&ok);
if(ok || text == "" || text == "-")
lastEdited = text;
else
{
lineedit->setText(lastEdited);
lineedit->setCursorPosition(cursorPosition-1);
}
}
if(data_type == "double"){
bool ok;
text.toDouble(&ok);
if(ok || text == "" || text == "-")
lastEdited = text;
else
{
lineedit->setText(lastEdited);
lineedit->setCursorPosition(cursorPosition-1);
}
}
}
/**
* @brief CUILineEdit::showMsg 显示提示信息
*/
void CUILineEdit::showMsg()
{
QString msg = "";
if(check_range_){
if(inclusive_){
msg += "["+range_min_.toString()+","+range_max_.toString()+"] ";
}else{
msg += "("+range_min_.toString()+","+range_max_.toString()+") ";
}
}
if(required_){
msg += "\t(必填)";
}
lineedit->setPlaceholderText(msg);
}
/**
* @brief CUILineEdit::checkRange 检查范围,并给出提示
*/
bool CUILineEdit::checkRange()
{
bool res = true;
if(check_range_){
QPalette palette = lineedit->palette();
res = isInRange();
if(res){
palette.setColor(QPalette::Text, Qt::black);
}else{
palette.setColor(QPalette::Text, Qt::red);
}
lineedit->setPalette(palette);
}
return res;
}
/**
* @brief CUILineEdit::onTextChanged 槽函数
*
* 当文本改变时,根据设置的类型修改LineEdit的内容
* 当文本改变时,如果有范围设置,不在范围内则标红
*
* @param text 当前输入后的文本内容
*/
void CUILineEdit::onTextChanged(const QString &text)
{
checkType(text);
checkRange();
}