QT使用提升自定义组件

QTC++QT自定义

QT 组件提升来实现自定义功能

介绍

我们在使用QT设置界面之后,往往需要自己实现一些方法,如果是单独 的还好,但是如果遇到很多同类型的都有需求,

比如 我们使用 QLineEdit 来处理数据,每次填入的数值都要更新到一个参数值中的时候, 我们需要将这个输入框的完成信号 连接到一个自定义的函数中 来更改某个值,

如果很多的时候, 我们就可以使用 继承组件然后使用提升来做了

应用

如图所示的界面,我们需要对每个单行编辑框, 完成点击按钮就调整值的的方法


QT界面

具体的提升的方法可以参考 Qt自定义控件以及控件的提升 的具体做法, 这里只介绍我们使用的方法

我们自定义的 类为 CLineEdit

我们设置了 公开的 Associate 函数, 将我们需要显示的 QLineEdit 组件 和两个 点击按钮以及内存存储相应数据的位置 关联起来, 点击相应按钮之后 会执行内存数据的加减, 然后再显示在相应的组件上, 便于查看,

实现代码

具体实现代码
/**
* @file Code\model\clineedit.h.
* @copyright Copyright (c) 2019 IRIS_Chen IRIS Lab
*
* @brief Declares the clineedit class
* @changelog 2019/11/12 IRIS_Chen Created.
*/ #ifndef CLINEEDIT_H
#define CLINEEDIT_H #include <QObject>
#include <QPushButton>
#include <QLineEdit>
#include <QMouseEvent>
#include <QLabel>
#include <QObject>
#include <QWidget>
#include <QString> /**
* @class CLineEdit clineedit.h Code\model\clineedit.h
*
* @brief 继承Qt 自定义文件 提升成为自己的组件, 修改窗口的值之后 保证相应的值 直接赋值到相应的内存中 如果关联了相应的 点击按钮, 按钮点击之后可以触发 数据更改
*
* @author IRIS_Chen
* @date 2019/11/13
*/ class CLineEdit : public QLineEdit
{ private: int *m_data_; ///< 指定数据关联的指针
QPushButton *btn_plus_; ///< 定义增加按钮
QPushButton *btn_minus_; ///< 定义减少按钮
public:
explicit CLineEdit(QWidget *parent = nullptr) :
QLineEdit(parent),
m_data_(nullptr),
btn_plus_(nullptr),
btn_minus_(nullptr)
{
// 输入完成进入自定义处理函数 }
/**
* @fn bool CLineEdit::Associate(int *data, bool over = true)
*
* @brief 将内存与组件关联
*
* @author IRIS_Chen
* @date 2019/11/13
*
* @param [in,out] data If non-null, the data
* @param over (Optional) True to over
*
* @return True if it succeeds, false if it fails
*/ bool Associate(int *data, bool over = true)
{
// 有值且不让覆盖 返回出错
if (!over && m_data_ != nullptr)
return false;
m_data_ = data;
ShowData();
return true;
} /**
* @fn bool CLineEdit::Associate(int *data, QPushButton *plus, QPushButton *minus, bool over = true)
*
* @brief 关联数据 和两个按钮
*
* @author IRIS_Chen
* @date 2019/11/13
*
* @param [in,out] data If non-null, the data
* @param [in,out] plus If non-null, the plus
* @param [in,out] minus If non-null, the minus
* @param over (Optional) True to over
*
* @return True if it succeeds, false if it fails
*/ bool Associate(int *data, QPushButton *plus, QPushButton *minus, bool over = true)
{
// 有值且不让覆盖 返回出错
if (!over && (m_data_ || btn_minus_ || btn_plus_))
return false;
m_data_ = data;
btn_minus_ = minus;
btn_plus_ = plus; // 关联 按钮点击信号
QObject::connect(this, &QLineEdit::editingFinished, this, &CLineEdit::LineEditDataProc);
QObject::connect(btn_plus_, &QPushButton::clicked, this, &CLineEdit::LineEditDataPlus);
QObject::connect(btn_minus_, &QPushButton::clicked, this, &CLineEdit::LineEditDataMinus); ShowData();
return true;
}
private slots:
/**
* @fn bool CLineEdit::LineEditDataProc(void)
*
* @brief 数据输入完成 将数据存储相应内存中
* 暂时只考虑 数据部分, 将填入的数据内容给 获取出来
*
* @author IRIS_Chen
* @date 2019/11/13
*
* @return True if it succeeds, false if it fails
*/ bool LineEditDataProc(void)
{
if (!m_data_)
return false;
QString str = this->text();
int num = str.toInt();
// 转换相应的值存储
*(this->m_data_) = static_cast<int>(num);
// LTrace("line data Edit:{}--{}", (int)m_data_, *m_data_);
return true;
} /**
* @fn bool CLineEdit::LineEditDataPlus(void)
*
* @brief 数据 增加 并做显示
*
* @author IRIS_Chen
* @date 2019/11/13
*
* @return True if it succeeds, false if it fails
*/ bool LineEditDataPlus(void)
{
if (!m_data_)
return false;
*m_data_ = *m_data_ + 1;
ShowData();
// LTrace("line data Plus:{}--{}", (int)m_data_, *m_data_);
return true;
} /**
* @fn bool CLineEdit::LineEditDataMinus(void)
*
* @brief 数据减少 信号
*
* @author IRIS_Chen
* @date 2019/11/13
*
* @return True if it succeeds, false if it fails
*/ bool LineEditDataMinus(void)
{
if (!m_data_)
return false;
*m_data_ = *m_data_ - 1; ShowData();
// LTrace("line data Minus:{}--{}", (int)m_data_, *m_data_);
return true;
}
private: /**
* @fn void CLineEdit::ShowData(void)
*
* @brief Shows the data
*
* @author IRIS_Chen
* @date 2019/11/13
*/
void ShowData(void)
{
if (m_data_)
{
QString str = QString::number(*m_data_);
this->setText(str);
string tmp = str.toStdString();
}
}
};
#endif // CLINEEDIT_H

更多

我们可以设置相应的更为复杂的提升, 不仅关联 int 类型数据, 还能关联其他类型的数据比如字符串之类的 便于后续开发过程

参考链接

  1. Qt自定义控件以及控件的提升
  2. Qt基础学习(3)-----滑动条之QSlider
  3. Qt中控件类的提升

QT使用提升自定义组件的更多相关文章

  1. 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数

    今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...

  2. QT为QLabel添加Click事件(如果我们使用组件,我们关心的是信号槽;如果我们自定义组件,我们关心的是事件)

    其实就是改写了一个函数:mouseReleaseEvent,当在QLabel放开鼠标的时,就发射点击信号. #ifndef CLICKEDLABEL_H_ #define CLICKEDLABEL_H ...

  3. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  4. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...

  5. 自定义组件v-model的实质性理解

    用了几个月Vue一直很纠结自定义组件的v-model实现,最近开始学习React时,React中受控组件与状态提升的理念与v-model不谋而合. 转载请注明地址: https://www.cnblo ...

  6. 【Spring注解驱动开发】自定义组件如何注入Spring底层的组件?看了这篇我才真正理解了原理!!

    写在前面 最近,很多小伙伴出去面试都被问到了Spring问题,关于Spring,细节点很多,面试官也非常喜欢问一些很细节的技术点.所以,在 Spring 专题中,我们尽量把Spring的每个技术细节说 ...

  7. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

  8. Android自定义组件

    [参考的原文地址] http://blog.csdn.net/l1028386804/article/details/47101387效果图: 实现方式: 一:自定义一个含有EditText和Butt ...

  9. 自己写的几个android自定义组件

    http://www.see-source.com/androidwidget/list.html 多多指点,尤其是自定义组件的适配问题,希望能有更好的方法

随机推荐

  1. CSS躬行记(3)——CSS属性拾遗

    一.粘滞定位 粘滞定位(sticky)与相对定位类似,既不会脱离正常流,也不会改变元素盒类型,并且会保留原先所占的空间.它会相对于包含块偏移,它的包含块分为两种,第一种和绝对定位一样:第二种是最近的滚 ...

  2. Educational Codeforces Round 83 (Rated for Div. 2)

    A. Two Regular Polygons 题意:给你一个 正n边形,问你能否以这个 n 的其中一些顶点组成一个 m边形, 思路 :如果 n % m == 0 ,就可 收获:边均分 B. Bogo ...

  3. STM32F103ZET6的基本定时器

    1.定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8.STM32的定时器分为基本定时器.通用定时器和高等定时器. TIM6.TIM7是基本定时器.基本定时器是只能向 ...

  4. 1051 Pop Sequence (25分)

    Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...

  5. 【Linux】Apache服务配置

    一. URL 统一资源定位符 http://www.sina.com.cn:80/admin/index.html 二. 环境安装 LAMP 源码包编译安装 版本可以自定义 生产环境 安全 稳定 开发 ...

  6. readthedocs网托管持多语言文档

    希望在readthedocs上创建支持多语言的文档,效果类似: 通过语言选项,可以切到到不同的语言版本:实现这个目标包含两个主要步骤: 在本地对文档进行翻译 在readthedocs.org上配置翻译 ...

  7. Python进度条模块tqdm实现任务进度可视化

    一.前言 tqdm 是一个易用性强.扩展性高的 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息,我们只需要封装任意的迭代器 tqdm(iterator) 即可. 二.安装 ...

  8. CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR-10上仅需单卡半天 | CVPR 2020

    为了优化进化算法在神经网络结构搜索时候选网络训练过长的问题,参考ENAS和NSGA-III,论文提出连续进化结构搜索方法(continuous evolution architecture searc ...

  9. HBase协处理器加载的三种方式

    本文主要给大家罗列了HBase协处理器加载的三种方式:Shell加载(动态).Api加载(动态).配置文件加载(静态).其中静态加载方式需要重启HBase. 我们假设我们已经有一个现成的需要加载的协处 ...

  10. 使用rem配置PC端自适应大屏

    效果如下 使得大屏不论在什么宽高比例依然能展示全部数据 安装 npm install -S postcss-pxtorem rem配置思路 原先的rem函数是能解决大部分的问题的,如果展示不全,也可以 ...