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. 从谷歌 GFS 架构设计聊开去

    伟人说:“人多力量大.” 尼古拉斯赵四说:“没有什么事,是一顿饭解决不了的!!!如果有,那就两顿.” 研发说:“需求太多,人手不够.” 专家说:“人手不够,那就协调资源,攒人头.” 释义:一人拾柴火不 ...

  2. 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 ...

  3. 部署mysql主从同步

                                                 mysql-day06        部署mysql主从同步 案例拓扑 • 一主.一从 – 单向复制时,建议将 ...

  4. docker 私有仓库 删除镜像

    1.查找官方删除法 https://github.com/burnettk/delete-docker-registry-image 2.民用删除法 https://segmentfault.com/ ...

  5. python 函数--生成器

    一.生成器函数: 常规定义函数,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果. 好处在于,不会一下占用很多内存生成数据. 本质:就是一个迭代器. python中提供 ...

  6. foreach-- for循环的增强型:for(类型 变量 : 数组对象) { 使用变量 }

    /* * foreach:增强for循环,一般用于遍历集合或者数组 * 格式: * for(元素的类型 变量 : 集合或者数组对象) { * 可以直接使用变量; * } 注意:在增强for循环中不能修 ...

  7. 答好友困惑:Java零基础如何入门,不知道怎么学,迷茫ING

    作者:程序员小跃 几个星期之前,我在知乎上看到一个提问,说是:对于完全没有经验零基础自身的数学底子也很弱学习Java应该怎么学习呢?想着类似的问题我也有过回答,并且反馈还是蛮好的,就参考之前的思路回答 ...

  8. Flutter 吐血整理组件继承关系图

    老孟导读:前几天一个读者和我说能不能整理一个各个控件之间的继承关系,这2天抽时间整理了一下,不整理不知道,一整理真的吓一跳啊,仅仅Widget的子类(包括间接子类)就高达353个,今天发群里给大家浏览 ...

  9. 拓扑排序入门详解&&Educational Codeforces Round 72 (Rated for Div. 2)-----D

    https://codeforces.com/contest/1217 D:给定一个有向图,给图染色,使图中的环不只由一种颜色构成,输出每一条边的颜色 不成环的边全部用1染色 ps:最后输出需要注意, ...

  10. [算法总结]DFS(深度优先搜索)

    目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...