BitWidget,自定义bit控件

 由于QBitArray并不满足我做界面是的需求,所以参照QBitArray简单的写了个控件,如下所示,源码及实例在我上传的资源包中

实例

帮助文档如图所示(部分)

帮助文档(在资源包中)

1.html文档

2.chm文档

源码

头文件

#ifndef BITWIDGET_H
#define BITWIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QFormLayout>
#include <QLabel>
#include <QCheckBox>
#include <QBitArray>
#include <QDebug>

namespace Ui {
class BitWidget;
}
/**
 * @brief 辅助做单个bit显示控件
 */
struct Bit
{
    QLabel* bitLabel=nullptr;///< 界面显示bit文本标签
    QCheckBox* bitCheckBox=nullptr;///< 界面显示bit值复选框
};

class BitWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief bit控件
     * @param bitSize bit位数
     * @param AlignmentFlag 对齐方式:仅对两个参数有效Qt::AlignHCenter与Qt::AlignVCenter
     * @param parent
     */
    explicit BitWidget(int bitSize=8,Qt::AlignmentFlag AlignmentFlag=Qt::AlignHCenter,QWidget *parent = 0);
    ~BitWidget();
    int setValue(const int &value);///< 设置置
    int getValue();///< 获取值
    bool at(int bitPos) const;///<获取bitPos值
    void clear();///< 将所有bit位置0
    void clearBit(int bitPos);///< 将bitPos值置0
    int count() const;///<返回bit数
    int count(bool on) const;///<返回1的数量
    bool fill(bool value, int size = -1);///<从bit0开始填充,如果size=-1,则填充所有,否则,从0开始填充size数量的value
    bool fill(bool value, int begin, int end);///< 从begin开始填充置end;如果end>begin,则返回false,如果end>bit位总数,则填充置bit位总数
    bool isEmpty() const;///< bit位总数为0,返回false,否则返回true
    void resize(int bitSize);///< 重设bit位总数
    bool setBit(int bitPos);///< 将bitPos置1,成功返回true,否则返回false;
    bool setBit(int bitPos, bool value);///< 将bitPos置value,成功返回true,否则返回false;
    int size() const;///< 等价count()
    bool testBit(int bitPos) const;///< 等价setBit(int bitPos)
    bool toggleBit(int bitPos);///< 翻转bitPos位,成功返回ture,否则返回false

private:
    void Init();
    void UiInit();
private:
    Ui::BitWidget *ui;
    int m_bitSize;///< bit 数量
    Qt::AlignmentFlag m_AlignmentFlag;///< 对齐方式
    QVector<Bit> m_VBit;///< bit控件
    QGridLayout *m_layout=nullptr;///< 界面布局
};

#endif // BITWIDGET_H

源文件

#include "bitwidget.h"
#include "ui_bitwidget.h"
#include "Windows.h"

BitWidget::BitWidget(int bitSize, Qt::AlignmentFlag AlignmentFlag, QWidget *parent) :
    m_bitSize(bitSize),
    m_AlignmentFlag(AlignmentFlag),
    QWidget(parent),
    ui(new Ui::BitWidget)
{
    ui->setupUi(this);
    Init();
}

BitWidget::~BitWidget()
{
    delete ui;
}

bool BitWidget::at(int bitPos) const
{
    if(bitPos>m_bitSize-1)return false;
    return m_VBit.at(bitPos).bitCheckBox->isChecked();
}

void BitWidget::clear()
{
    for(int i=0;i<m_bitSize;++i)
    {
        m_VBit.at(i).bitCheckBox->setChecked(false);
    }
}

void BitWidget::clearBit(int bitPos)
{
    if(bitPos>m_bitSize-1)return;
    m_VBit.at(bitPos).bitCheckBox->setChecked(false);
}

int BitWidget::count() const
{
    return m_bitSize;
}

int BitWidget::count(bool on) const
{
    int cnt=0;
    for(int i=0;i<m_bitSize;++i)
    {
        if(m_VBit.at(i).bitCheckBox->isChecked()==on)
        {
            cnt++;
        }
    }
    return cnt;
}

bool BitWidget::fill(bool value, int size)
{
    int fillsize=0;
    if(size==-1)
    {
        fillsize=m_bitSize-1;
    }else
    {
        fillsize=size-1;
    }
    if(m_bitSize==0)return false;
    for(int i=0;i<m_bitSize;++i)
    {
        if(i>fillsize)break;
        m_VBit.at(i).bitCheckBox->setChecked(value);
    }
    return true;
}

bool BitWidget::fill(bool value, int begin, int end)
{
    if(begin>end)return false;
    for(int i=begin;i<end+1;++i)
    {
        if(i>m_bitSize-1)break;
        m_VBit.at(i).bitCheckBox->setChecked(value);
    }
    return true;
}

bool BitWidget::isEmpty() const
{
    return m_VBit.isEmpty();
}

void BitWidget::resize(int bitSize)
{
    if(m_VBit.length()>bitSize)
    {
        for(int i = 0;i<m_VBit.length();++i)
        {
            if(i>=bitSize)
            {
                m_VBit.at(i).bitLabel->hide();
                m_VBit.at(i).bitCheckBox->hide();
                m_VBit.at(i).bitCheckBox->setChecked(false);
            }
            else
            {
                m_VBit.at(i).bitLabel->show();
                m_VBit.at(i).bitCheckBox->show();
            }
        }
    }
    else if(m_VBit.length()<=bitSize)
    {
        switch (m_AlignmentFlag) {
        case Qt::AlignHCenter:
        {
            for(int col=m_VBit.length();col<bitSize;++col)
            {
                Bit bit;
                bit.bitLabel=new QLabel(this);
                bit.bitCheckBox=new QCheckBox(this);
                bit.bitLabel->setText(QString("%1").arg(col));
                bit.bitLabel->setAlignment(Qt::AlignBottom);
                m_layout->addWidget(bit.bitLabel,0,col,1,1);
                m_layout->addWidget(bit.bitCheckBox,1,col,1,1);
                m_layout->setSpacing(1);
                this->setLayout(m_layout);
                m_VBit.append(bit);
            }
        }
            break;
        case Qt::AlignVCenter:
        {
            for(int row=m_VBit.length();row<bitSize;++row)
            {
                Bit bit;
                bit.bitLabel=new QLabel(this);
                bit.bitCheckBox=new QCheckBox(this);
                bit.bitLabel->setText(QString("%1").arg(row));
                bit.bitLabel->setAlignment(Qt::AlignRight);
                m_layout->addWidget(bit.bitLabel,row,0,1,1);
                m_layout->addWidget(bit.bitCheckBox,row,1,1,1);
                m_layout->setSpacing(1);
                this->setLayout(m_layout);
                m_VBit.append(bit);
            }
        }
            break;
        default:
            break;
        }
        for(int i = 0;i<m_VBit.length();++i)
        {
            m_VBit.at(i).bitLabel->show();
            m_VBit.at(i).bitCheckBox->show();
        }
    }
    m_bitSize=bitSize;
}

bool BitWidget::setBit(int bitPos)
{
    if(bitPos>m_bitSize-1)return false;
    m_VBit.at(bitPos).bitCheckBox->setChecked(true);
    return true;
}

bool BitWidget::setBit(int bitPos, bool value)
{
    if(bitPos>m_bitSize-1)return false;
    m_VBit.at(bitPos).bitCheckBox->setChecked(value);
    return true;
}

int BitWidget::size() const
{
    return count();
}

bool BitWidget::testBit(int bitPos) const
{
    if(bitPos>m_bitSize-1)return false;
    m_VBit.at(bitPos).bitCheckBox->setChecked(true);
    return true;
}

bool BitWidget::toggleBit(int bitPos)
{
    if(bitPos>m_bitSize-1)return false;
    auto val=m_VBit.at(bitPos).bitCheckBox->isChecked();
    val=!val;
    m_VBit.at(bitPos).bitCheckBox->setChecked(val);
    return true;
}

void BitWidget::Init()
{
    UiInit();
}

void BitWidget::UiInit()
{
    if(m_layout==nullptr)
    {
        m_layout=new QGridLayout(this);
    }
    switch (m_AlignmentFlag) {
    case Qt::AlignHCenter:
    {
        for(int col=0;col<m_bitSize;++col)
        {
            Bit bit;
            bit.bitLabel=new QLabel(this);
            bit.bitCheckBox=new QCheckBox(this);
            bit.bitLabel->setText(QString("%1").arg(col));
            bit.bitLabel->setAlignment(Qt::AlignBottom);
            m_layout->addWidget(bit.bitLabel,0,col,1,1);
            m_layout->addWidget(bit.bitCheckBox,1,col,1,1);
            m_layout->setSpacing(1);
            this->setLayout(m_layout);
            m_VBit.append(bit);
        }
    }
        break;
    case Qt::AlignVCenter:
    {
        for(int row=0;row<m_bitSize;++row)
        {
            Bit bit;
            bit.bitLabel=new QLabel(this);
            bit.bitCheckBox=new QCheckBox(this);
            bit.bitLabel->setText(QString("%1").arg(row));
            bit.bitLabel->setAlignment(Qt::AlignRight);
            m_layout->addWidget(bit.bitLabel,row,0,1,1);
            m_layout->addWidget(bit.bitCheckBox,row,1,1,1);
            m_layout->setSpacing(1);
            this->setLayout(m_layout);
            m_VBit.append(bit);
        }
    }
        break;
    default:
        break;
    }
}


int BitWidget::setValue(const int &value)
{
    int bitPos=-1;
    auto temp=value;
    for(int i=0;i<m_bitSize;++i)
    {
        m_VBit.at(i).bitCheckBox->setChecked(false);
    }
    while(temp)
    {
        bitPos++;
        if(bitPos>=m_bitSize)break;
        if(temp&0x01)
        {
            m_VBit.at(bitPos).bitCheckBox->setChecked(true);
        }
        temp >>= 1;
    }
    return bitPos;
}

int BitWidget::getValue()
{
    int val=0;
    for(int i=0;i<m_bitSize;++i)
    {
        auto temp=m_VBit.at(i).bitCheckBox->isChecked()?1:0;
        val|=(temp<<i);
    }
    return val;
}

 实例代码

 example头文件

#ifndef EXAMPLE_H
#define EXAMPLE_H

#include <QWidget>
#include "bitwidget.h"

namespace Ui {
class Example;
}

class Example : public QWidget
{
    Q_OBJECT

public:
    explicit Example(QWidget *parent = 0);
    ~Example();

private slots:

    void on_pushButtonat_clicked();

    void on_pushButtonclear_clicked();

    void on_pushButtonclearBit_clicked();

    void on_pushButtoncount_clicked();

    void on_pushButtoncount_on_clicked();

    void on_pushButtonfill_clicked();

    void on_pushButtonfill_begin_end_clicked();

    void on_pushButtonisEmpty_clicked();

    void on_pushButtonresize_clicked();

    void on_pushButtonsetBit_clicked();

    void on_pushButtonsetBit_value_clicked();

    void on_pushButtonsize_clicked();

    void on_pushButtontestBit_clicked();

    void on_pushButtontoggleBit_clicked();

    void on_pushButtonsetValue_clicked();

    void on_pushButtongetValue_clicked();

private:
    Ui::Example *ui;
    BitWidget *m_bitWidget=nullptr;
};

#endif // EXAMPLE_H

example源文件

#include "example.h"
#include "ui_example.h"

Example::Example(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Example)
{
    ui->setupUi(this);
    m_bitWidget=new BitWidget(8,Qt::AlignHCenter,this);
    ui->gridLayoutBitWidget->addWidget(m_bitWidget,0,0,1,1);
}

Example::~Example()
{
    delete ui;
}

void Example::on_pushButtonat_clicked()
{
    ui->labelat->setText(m_bitWidget->at(ui->spinBoxat->value())?"1":"0");
}

void Example::on_pushButtonclear_clicked()
{
    m_bitWidget->clear();
}

void Example::on_pushButtonclearBit_clicked()
{
    m_bitWidget->clearBit(ui->spinBoxclearBit->value());
}

void Example::on_pushButtoncount_clicked()
{
    ui->labelcount->setNum(m_bitWidget->count());
}

void Example::on_pushButtoncount_on_clicked()
{
    ui->labelcount_on->setNum(m_bitWidget->count(ui->checkBoxcount_on->isChecked()));
}

void Example::on_pushButtonfill_clicked()
{
    m_bitWidget->fill(ui->checkBoxvalue->isChecked(),ui->spinBoxfill->value());
}

void Example::on_pushButtonfill_begin_end_clicked()
{
    m_bitWidget->fill(ui->checkBoxvalue_2->isChecked(),ui->spinBoxfillbegin->value(),ui->spinBoxfillend->value());
}

void Example::on_pushButtonisEmpty_clicked()
{
    ui->labelisEmpty->setText(m_bitWidget->isEmpty()?"ture":"false");
}

void Example::on_pushButtonresize_clicked()
{
    m_bitWidget->resize(ui->spinBoxresize->value());
}

void Example::on_pushButtonsetBit_clicked()
{
    m_bitWidget->setBit(ui->spinBoxsetBit->value());
}

void Example::on_pushButtonsetBit_value_clicked()
{
    m_bitWidget->setBit(ui->spinBoxsetBit_value->value(),ui->checkBoxsetBit_value->isChecked());
}

void Example::on_pushButtonsize_clicked()
{
    ui->labelsize->setNum(m_bitWidget->size());
}

void Example::on_pushButtontestBit_clicked()
{
    m_bitWidget->setBit(ui->spinBoxtestBit->value());
}

void Example::on_pushButtontoggleBit_clicked()
{
    m_bitWidget->toggleBit(ui->spinBoxtoggleBit->value());
}

void Example::on_pushButtonsetValue_clicked()
{
   auto ret= m_bitWidget->setValue(ui->spinBoxsetValue->value());
   ui->labelsetValue->setNum(ret);
}

void Example::on_pushButtongetValue_clicked()
{
    ui->labelgetValue->setNum(m_bitWidget->getValue());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统期末复习真题练习二

选择题 1.在操作系统中,处于就绪状态和等待状态的进程都没有占用处理机,当处理机空闲时()。 A.就绪状态的进程和等待状态的进程都可以转换成运行状态 B.只有就绪状态的进程可以转换成运行状态 C.只有等待状态的进程可以转换成运行状态 D.就绪状态的进程和等待状态的进程都不能转…

MinIO - 从 环境搭建 -> SpringBoot实战 -> 演示,掌握 Bucket 和 Object 操作

目录 开始 Docker 部署 MinIO 中的基本概念 SpringBoot 集成 MinIO 依赖 配置 MinIO 时间差问题报错 The difference between the request time and the servers time is too large MinIO 中对 Bucket&#xff08;文件夹&#xff09; 的操作 是否存在 / 创建 查询所有…

图像处理调试软件推荐

对于图像处理的调试&#xff0c;使用具有图形用户界面&#xff08;GUI&#xff09;且支持实时调整和预览的图像处理软件&#xff0c;可以大大提高工作效率。以下是几款常用且功能强大的图像处理调试软件推荐&#xff1a; ImageJ/FijiMATLABOpenCV with GUI LibrariesNI Vision …

绝了,华为伸缩摄像头如何突破影像边界?

自华为Pura70 Ultra超聚光伸缩镜头诞生以来&#xff0c;备受大家的关注&#xff0c;听说这颗镜头打破了传统手机的摄像头体积与镜头的设计&#xff0c;为我们带来了不一样的拍照体验。 智能手机飞速发展的今天&#xff0c;影像功能已经成为我们衡量一款手机性能的重要指标。想…

Mac|install vue

安装Node&#xff1a;Node.js — Download Node.js 选择系统为mac&#xff0c;安装步骤在终端输入 &#xff08;放文字版在这里&#xff5e;方便复制&#xff09; # installs nvm (Node Version Manager) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/ins…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

ctfshow web入门 web338--web344

web338 原型链污染 comman.js module.exports {copy:copy };function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] object2[key]}}}login.js var express …

c/c++ 程序运行的过程分析

c/c编译基础知识 GNU GNU&#xff08;GNU’s Not Unix!&#xff09;是一个由理查德斯托曼&#xff08;Richard Stallman&#xff09;在1983年发起的自由软件项目&#xff0c;旨在创建一个完全自由的操作系统&#xff0c;包括操作系统的内核、编译器、工具、库、文本编辑器、邮…

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

前端正悄悄蚕食后端开发者的工作,这真的好吗?

**前端正悄悄蚕食后端开发者的工作&#xff0c;这真的好吗&#xff1f;** 前端开发者的职责范围正在逐渐扩大。从最初的单纯页面设计&#xff0c;到现在的与后端数据交互、应用逻辑处理等&#xff0c;前端开发者在项目中的作用日益重要。与此同时&#xff0c;这也引发了一个值…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧&#xff0c;这篇文章一定要收藏好。在硬盘使用过程中&#xff0c;很多情况都会导致数据丢失&#xff0c;例如硬盘跌落、病毒感染、系统文件损坏等。这时候&#xff0c;一定要采用正确的方法&#xff0c;抢救硬盘中存储的珍贵数据和文档。 有关长期保…

技术实现路径怎么写?(Word项目技术路径文档参考)

软件项目编写技术实现路径至关重要&#xff0c;因为它为项目团队提供了清晰的开发蓝图。这一路径明确了从项目启动到交付各阶段所需的技术方案、步骤及预期成果&#xff0c;有助于团队统一认识&#xff0c;确保开发工作有序进行。同时&#xff0c;技术实现路径有助于识别潜在的…

ELK优化之Filebeat部署

目录 1.安装配置Nginx 2.安装 Filebeat 3.设置 filebeat 的主配置文件 4.修改Logstash配置 5.启动配置 6.kibana验证 主机名ip地址主要软件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

Docker(二):Docker image Docker Container

本文将介绍 Docker 映像和容器以及 docker 文件之间的差异与联系&#xff0c;本文还将解释如何以及何时使用它们。 什么是 Dockerfile&#xff1f; 它是一个简单的文本文件&#xff0c;包含命令或过程的集合。我们运行的这些命令和准则作用于配置为创建新的 Docker 镜像的基本…

G1.【C语言】EasyX初步了解

1.介绍 EasyX 是针对 C/C 的图形库&#xff0c;可以帮助使用C/C语言的程序员快速上手图形和游戏编程。 2.安装 EasyX Graphics Library for CEasyX Graphics Library 是针对 Visual C 的绘图库&#xff0c;支持 VC6.0 ~ VC2019&#xff0c;简单易用&#xff0c;学习成本极低…

轻预压:滚珠丝杆精度与刚性的平衡点!

预压是指在所需的工作负荷下&#xff0c;使滚珠丝杆预先承受一定的负荷&#xff0c;从而使滚珠丝杆的轴向向心度和侧向偏差达到较小的偏差范围&#xff0c;保证了滚珠丝杆的准确性和稳定性&#xff0c;也确保机器的高精度和长期运作的可靠性。 预压是滚珠丝杆设计中的一个重要参…

vue3项目图片压缩+rem+自动重启等plugin使用与打包配置

一、Svg配置 每次引入一张 SVG 图片都需要写一次相对路径&#xff0c;并且对 SVG 图片进行压缩优化也不够方便。 vite-svg-loader插件加载SVG文件作为Vue组件&#xff0c;使用SVGO进行优化。 插件网站https://www.npmjs.com/package/vite-svg-loader 1. 安装 pnpm i vite-svg…

智能与伦理:Kimi与学术道德的和谐共舞

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 Kimi&#xff0c;由月之暗面科技有限公司开发的智能助手&#xff0c;擅长中英文对话&#xff0c;能处理多种文档和网页内容。在论文写作中&#xff0c;Kimi可提供资料查询、信息整理、语…

JavaWeb--jquery篇

概述 jQuery是一个快速、简洁的JavaScript框架&#xff0c;是一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。它封装JavaScript常用的功能代码&#xff0c;提供一种简便的JavaScript设计模式&#xff0c;优化HTML文档操作、事件处理、动…

Faster-RCNN·代码解读系列01:Selective Search 和 R-CNN、Fast-CNN 简介

Selective Search 和 R-CNN、Fast-CNN 简介 1 目标检测算法简介1.0滑窗法的思路1.1 Selective Search 和 R-CNN 简介1.2.1 Selective Search简介1.1.1 Selective Search的思路1.1.2 Selective Search图解 1.2 Selective Search 和 Fast-CNN简介1.2.1 SPP和ROI Pooling简介1.2.2…