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. 项目伪模块化开发之:requirejs(AMD)开发

    附:伪模块开发,终将会被es6的模块开发取代.其只为过渡阶段使用 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码 ...

  2. 记python 链式比较的坑

    前两天,python交流群里有人问: “x”<"y"==True 这个表达式输出的是什么,脑子都没动,就觉得应该是True 居然被否定了!立马在命令行里敲了一下,准备用事实打 ...

  3. PHP的运行方式(SAPI)

    PHP 常量 PHP_SAPI 具有和 php_sapi_name() 相同的值. define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== ...

  4. 家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转

    这次主要完成了两个两个android页面之间的跳转.从登录页面点击注册就会跳转到注册页面.在注册页面点击返回登录,这样就可以返回到登录界面.主要是这样的操作.其中遇到了一个困难主要是当点击按钮的时候, ...

  5. django、celery异步发邮件

    django.celery异步发邮件 django自带的send_mail发邮件功能执行发邮件功能会因为网络的原因造成花费的时间过长,为了解决这个问题,可以用celery + redis代替 安装包: ...

  6. 在OS X环境下MySQL启动时报错

    --03T00::.483037Z [ERROR] InnoDB: Unable to lock ./ibdata1 error: --03T00::.483100Z [Note] InnoDB: C ...

  7. Array(数组)对象-->数组值的修改

    1.修改数组值: 数组对象名[下标] = 新值: 举例:原数组如下: var arr = [1,2,3,4,5] 需求:将arr数组第二个元素的值改为10,代码如下: arr[1] = 10; con ...

  8. VMware 15.5虚拟机安装群晖NAS

     一.群晖nas简介 NAS(Network Attached Storage:网络附属存储),按字面意思理解其实就是网络存储器,可以理解为存储资料的网盘,云盘.NAS本身支持多种协议(如NFS.CI ...

  9. tf.nn.sigmoid_cross_entropy_with_logits 分类

    tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,,labels=None,logits=None,name=None) logits和la ...

  10. Python财经数据接口包TuShare的使用

    安装TuShare 方式1:pip install tushare 方式2:访问https://pypi.python.org/pypi/tushare/下载安装 方式3:将源代码下载到本地pytho ...