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. 十进制转化为非十进制C++代码

    还是先为大家介绍一下原理吧. 假设余数为 r ,十进制数为 n :(拆分为整数 zs ,余数 ys) 对 zs:需要将 zs 除 r 取余数,直到商为 0 停止,将余数倒序排列即可. 对 ys:需要将 ...

  2. minIO分布式集群搭建+nginx负载均衡

    暂时关闭防火墙 systemctl stop firewalld 查看防火墙状态 systemctl status firewalld 赋予最高权限 chmod +x minio !/bin/bash ...

  3. Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性

    在上一篇我们整理到了第七个示例,我们今天再接着往下整理.我们来看第八个示例: #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; ...

  4. docker下搭建nginx

    一.拉取nginx镜像 # docker pull nginx 等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 nginx 的镜像. 二.运行容器 以下命令使用 NGINX ...

  5. Martinjingyu的开发环境

    Mac Pro Book一台去年新款,最近这4年多折腾的东西总结下. Mac的包管理器首选HomeBrew,安装如下: ruby -e "$(curl -fsSL https://raw.g ...

  6. 微信小程序mpvue-动态改变navigationBarTitleText值

    通过JS动态 改变navigationBarTitleText的值 能否通过JS动态改变navigationBarTitleText的值? 方法一:可以在onLoad方法中通过wx.setNaviga ...

  7. 关于json语句的相关用法

    json语句: JSON 值可以是: 数字(整数或浮点数)字符串(在双引号中)逻辑值(true 或 false)数组(在中括号中)对象(在大括号中)null 对于json的的对象数组:var site ...

  8. python3(三十一)metaclass

    """ """ __author__ = 'shaozhiqi' # 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而 ...

  9. centos7 ip/映射/机器名变更/克隆(克隆后配置修改)|2

    1.  查看主机名,三个命令都可以 # hostname # uname -n # cat  /proc/sys/kernel/hostname 2.    使用 vi /etc/hostname 文 ...

  10. 一个java 码手 的老牛 --- 涉及 一些不错的java 基础课程

    http://www.zuidaima.      com/user/1550463811307520/share/collect.htm