BitWidget,自定义bit控件

news2025/2/24 7:02:49

 由于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.coloradmin.cn/o/1902281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Python绘制和弦图

使用Python绘制和弦图 和弦图效果代码 和弦图 和弦图用于展示数据的多对多关系&#xff0c;适合用于社交网络、交通流量等领域的分析。 效果 代码 import pandas as pd import holoviews as hv from holoviews import opts hv.extension(bokeh)# 示例数据 data [(A, B, 2),…

Java对象通用比对工具

目录 背景 思路 实现 背景 前段时间的任务中&#xff0c;遇到了需要识别两个对象不同属性的场景&#xff0c;如果使用传统的一个个属性比对equals方法&#xff0c;会存在大量的重复工作&#xff0c;而且为对象新增了属性后&#xff0c;比对方法也需要同步修改&#xff0c;不方…

JUC(java.util.concurrent)中的常见类

文章目录 Callable接口ReentrantLockReentrantLock 和 synchronized 的区别:如何选择使用哪个锁? 信号量SemaphoreCountDownLatch多线程环境使用ArrayList多线程使用 哈希表相关面试题 JUC放了和多线程有关的组件 Callable接口 和Runnable一样是描述一个任务,但是有返回值,表…

查询某个县区数据,没有的数据用0补充。

加油&#xff0c;新时代打工人&#xff01; 思路&#xff1a; 先查出有数据的县区&#xff0c;用县区编码判断&#xff0c;不存在县区里的数据。然后&#xff0c;用union all进行两个SQL拼接起来。 SELECTt.regionCode,t.regionName,t.testNum,t.sampleNum,t.squareNum,t.crop…

springboot+vue+mybatis图书馆借阅管理系统+PPT+论文+讲解+售后

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

三分钟内了解卷轴模式

在数字化时代的浪潮中&#xff0c;卷轴商业模式巧妙地将积分体系、互动任务、社交裂变、虚拟经济体系以及个性化成长路径等多元要素融为一体。 积分体系&#xff1a;激发参与动力的源泉 卷轴商业模式的核心在于其精心构建的积分系统。新用户踏入平台&#xff0c;即获赠一笔启…

基于自编码器的时间序列异常检测方法(以传感器数据为例,MATLAB R2021b)

尽管近年来研究者对自编码器及其改进算法进行了深入研究&#xff0c;但现阶段仍存在以下问题亟须解决。 1) 无监督学习模式对特征提取能力的限制与有监督学习相比&#xff0c;无监督学习模式摆脱了对样本标签的依赖、避免了人工标注的困难&#xff0c;但也因此失去了样本标签的…

LLM - 循环神经网络(RNN)

1. RNN的关键点&#xff1a;即在处理序列数据时会有顺序的记忆。比如&#xff0c;RNN在处理一个字符串时&#xff0c;在对字母表顺序有记忆的前提下&#xff0c;处理这个字符串会更容易。就像人一样&#xff0c;读取下面第一个字符串会更容易&#xff0c;因为人对字母出现的顺序…

一站式解决方案:用ChatGPT和AutoGPT组建你的个人写作团队

ChatGPT 在 AI 内容创作领域带来了巨大的飞跃&#xff0c;然而它在撰写完整文章时偶尔会陷入废话和奇怪主题。作为专业作家、AI专家及OpenAI Beta测试人员&#xff0c;我一直探索AI写作。虽然ChatGPT表现出色&#xff0c;但有时难以达到创造高质量文章的标准。 最近&#xff0…

EtherCAT转Profinet网关配置说明第二讲:上位机软件配置

EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;&#xff0c;不仅可以实现数据之间的通信&#xff0c;还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;具有高速传输的特点&#xff0c;因此通…

githup开了代理push不上去

你们好&#xff0c;我是金金金。 场景 git push出错 解决 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都没有&#xff0c;代表没设置全局代理&#xff0c;此时如果你开了代理&#xff0c;则执行如下&#xff0c;设置代理 git con…

Github:git提交代码到github

创建 GitHub 仓库 a. 登录到您的 GitHub 账户。 b. 点击右上角的 "" 图标&#xff0c;选择 "New repository"。 c. 填写仓库名称&#xff08;例如 "Mitemer"&#xff09;。 d. 添加项目描述&#xff08;可选&#xff09;。 e. 选择仓库为 &…

微信小程序的轻松音乐-计算机毕业设计源码48092

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序的轻松音乐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统…

排序——数据结构与算法 总结8

目录 8.1 排序相关概念 8.2 插入排序 8.2.1 直接插入排序&#xff1a; 8.2.2 折半插入排序&#xff1a; 8.2.3 希尔排序&#xff1a; 8.3 交换排序 8.3.1 冒泡排序&#xff1a; 8.3.2 快速排序&#xff1a; 8.4 选择排序 8.4.1 简单选择排序 8.4.2 堆排序 8.5 归并…

C++--partition库函数

介绍 在C中&#xff0c;partition函数通常是指STL&#xff08;Standard Template Library&#xff09;中的std::partition算法&#xff0c;它用于对一个序列进行分区操作。具体来说&#xff0c;std::partition接受一个范围和一个谓词&#xff08;predicate&#xff09;作为参数…

策略为王股票软件源代码-----如何修改为自己软件73------------主界面右下角,大盘指数,时间显示 ,

IDS_MAINFRAME_SHINDEXTIP "沪:%2.f %+.2f %.2f亿" IDS_MAINFRAME_SZINDEXTIP "深:%2.f %+.2f %.2f亿" 主界面右下角,大盘指数,时间显示 , if( TIMER_TIME == nIDEvent ) { CSPTime time = CSPTime::GetCurrentTime(); …

去除gif动图背景的工具网站

选择视频或GIF - 取消屏幕 (unscreen.com)https://www.unscreen.com/upload

【论文解读】LivePortrait:具有拼接和重定向控制的高效肖像动画

&#x1f4dc; 文献卡 英文题目: LivePortrait: Efficient Portrait Animation with Stitching and Retargeting Control;作者: Jianzhu Guo; Dingyun Zhang; Xiaoqiang Liu; Zhizhou Zhong; Yuan Zhang; Pengfei Wan; Di ZhangDOI: 10.48550/arXiv.2407.03168摘要翻译: *旨在…

以腾讯为例,手把手教你搭建产品帮助中心

一个精心设计的产品帮助中心对于提高用户满意度和体验至关重要。腾讯&#xff0c;作为全球领先的互联网企业&#xff0c;通过其多样化的产品线&#xff08;包括微信、QQ、腾讯游戏、腾讯视频等&#xff09;吸引了亿万用户。下面将以腾讯为例&#xff0c;向您展示如何搭建一个高…

mysql修改字符集为UTF-8

启动 mysql 服务 systemctl start mysqld 登录 mysql mysql -uroot -p 查询 mysql 字符集 ## 在 mysql 命令行下查询 mysql 状态 mysql>status; 退出 mysql 并关闭 mysql ## 退出 mysql mysql>exit; ## 关闭 mysql systemctl stop mysqld 编辑 my.cnf 配置文…