使用QTableWidget实现录像排程操作

news2024/11/24 20:31:33

一、介绍

    该录像排程,是采用继承于QTableWidget的ScheduleTableWidget类进行实现。在ScheduleTableWidget实现类中,去除了Table原本的横向表头和纵向表头,分别采用第一行和第一列构成新的表头。新的横向表头代表一天24小时,新的纵向表头代表一周。新的横向表头是用setSpan合并了两个单元格,所以在它下面的每个单元格代表半个小时。横向表头和纵向表头都引入自定义委托,去实现字体、颜色等设置。多个选中区域可以通过按住Ctrl+鼠标左键绘制实现。在QtCreator下,录像排程运行的效果如下图所示:

在这里插入图片描述

二、相关接口

    录像排程的接口是通过带有0与1字符串,共7*48=336个字符来设置单元格是否为选中状态来实现。

2.1 全选操作

在这里插入图片描述

void MainWindow::on_pushButton_allSelect_clicked()
{
    QString strItem = QString("111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111"
                              "111111111111111111111111111111111111111111111111");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.2 清除所有

在这里插入图片描述

void MainWindow::on_pushButton_allClear_clicked()
{
    QString strItem = QString("000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000"
                              "000000000000000000000000000000000000000000000000");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.3 通过特定字符串设置

在这里插入图片描述

void MainWindow::on_pushButton_Set_clicked()
{
    QString strItem = QString("111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000"
                              "111111000000000000000000000000000000000000000000");
    ui->tableWidget->setItemSelectByString(strItem);
}

2.4 获取排程设置字符串

在这里插入图片描述

void MainWindow::on_pushButton_get_clicked()
{
    QString strItem;
    ui->tableWidget->getItemSelectByString(strItem);
    MY_DEBUG << "strItem:" << strItem;

    QMessageBox::information(this, "mySchedule", strItem);
}

三、核心代码

scheduletablewidget.h

#ifndef SCHEDULETABLEWIDGET_H
#define SCHEDULETABLEWIDGET_H

#include <QObject>
#include <QTableWidget>
#include <QVector>
#include <QDebug>
#include <QMessageBox>

#define ROW_HEIGHT 20
#define COLUMN_WIDTH 20

#define MAX_ITEM_COUNT 336
#define ROW_COUNT 8
#define COLUMN_COUNT 49


#define  MY_DEBUG  qDebug() << "[" << __FILE__ << ":" << __FUNCTION__ << ":" << __LINE__ << "] "

typedef struct SCHEDULE_POSITION
{
    int nRow;
    int nColumn;
}SCHEDULE_POSITION_T;


class ScheduleTableWidget : public QTableWidget
{
public:
    ScheduleTableWidget(QWidget *parent = Q_NULLPTR);
    ~ScheduleTableWidget(){}

    void initSchedule();

    void getItemSelectByString(QString& sItemValue);
    void setItemSelectByString(QString sItemValue);

 private:
    void getItemSelectByPos(QVector<SCHEDULE_POSITION_T>& vecSelectedItems);
    void setItemSelectByPos(QVector<SCHEDULE_POSITION_T> vecSelectedItems);

public:
    QVector<SCHEDULE_POSITION_T> m_vecSelectedItems;

};

#endif // SCHEDULETABLEWIDGET_H

scheduletablewidget.cpp


void ScheduleTableWidget::initSchedule()
{
	//表格设置
    //....

    //用首列和首行来作为新表头
    this->setSpan(0,1,1,2);
    this->setSpan(0,3,1,2);
    this->setSpan(0,5,1,2);
    this->setSpan(0,7,1,2);
    this->setSpan(0,9,1,2);
    this->setSpan(0,11,1,2);
    this->setSpan(0,13,1,2);
    this->setSpan(0,15,1,2);
    this->setSpan(0,17,1,2);
    this->setSpan(0,19,1,2);
    this->setSpan(0,21,1,2);
    this->setSpan(0,23,1,2);
    this->setSpan(0,25,1,2);
    this->setSpan(0,27,1,2);
    this->setSpan(0,29,1,2);
    this->setSpan(0,31,1,2);
    this->setSpan(0,33,1,2);
    this->setSpan(0,35,1,2);
    this->setSpan(0,37,1,2);
    this->setSpan(0,39,1,2);
    this->setSpan(0,41,1,2);
    this->setSpan(0,43,1,2);
    this->setSpan(0,45,1,2);
    this->setSpan(0,47,1,2);

    this->setItem(0, 0, new QTableWidgetItem("(Week/Hour)"));
    this->setItem(0, 1, new QTableWidgetItem("0"));
    this->setItem(0, 3, new QTableWidgetItem("1"));
    this->setItem(0, 5, new QTableWidgetItem("2"));
    this->setItem(0, 7, new QTableWidgetItem("3"));
    this->setItem(0, 9, new QTableWidgetItem("4"));
    this->setItem(0, 11, new QTableWidgetItem("5"));
    this->setItem(0, 13, new QTableWidgetItem("6"));
    this->setItem(0, 15, new QTableWidgetItem("7"));
    this->setItem(0, 17, new QTableWidgetItem("8"));
    this->setItem(0, 19, new QTableWidgetItem("9"));
    this->setItem(0, 21, new QTableWidgetItem("10"));
    this->setItem(0, 23, new QTableWidgetItem("11"));
    this->setItem(0, 25, new QTableWidgetItem("12"));
    this->setItem(0, 27, new QTableWidgetItem("13"));
    this->setItem(0, 29, new QTableWidgetItem("14"));
    this->setItem(0, 31, new QTableWidgetItem("15"));
    this->setItem(0, 33, new QTableWidgetItem("16"));
    this->setItem(0, 35, new QTableWidgetItem("17"));
    this->setItem(0, 37, new QTableWidgetItem("18"));
    this->setItem(0, 39, new QTableWidgetItem("19"));
    this->setItem(0, 41, new QTableWidgetItem("20"));
    this->setItem(0, 43, new QTableWidgetItem("21"));
    this->setItem(0, 45, new QTableWidgetItem("22"));
    this->setItem(0, 47, new QTableWidgetItem("23"));

    this->setItem(1, 0, new QTableWidgetItem("Monday"));
    this->setItem(2, 0, new QTableWidgetItem("Tuesday"));
    this->setItem(3, 0, new QTableWidgetItem("Wednesday"));
    this->setItem(4, 0, new QTableWidgetItem("Thursday"));
    this->setItem(5, 0, new QTableWidgetItem("Friday"));
    this->setItem(6, 0, new QTableWidgetItem("Saturday"));
    this->setItem(7, 0, new QTableWidgetItem("Sunday"));
}

void ScheduleTableWidget::getItemSelectByString(QString &sItemValue)
{
    QVector<SCHEDULE_POSITION_T> vecSelectedItems;
    getItemSelectByPos(vecSelectedItems);

    QByteArray arr;
    for(int i = 0; i < MAX_ITEM_COUNT; i++)
    {
        arr[i] = '0';
    }

    int nArrIndex = 0;
    for(int i = 0; i < vecSelectedItems.size(); i++)
    {
        nArrIndex = (vecSelectedItems[i].nRow-1)*(COLUMN_COUNT-1) + (vecSelectedItems[i].nColumn-1);
        arr[nArrIndex] = '1';
    }

    sItemValue = arr;
}

void ScheduleTableWidget::setItemSelectByString(QString sItemValue)
{
    MY_DEBUG << "sItemValue.count():" << sItemValue.count();
    if(sItemValue.count() < MAX_ITEM_COUNT)
    {
        QMessageBox::critical(this, "mySchedule", tr("error:Bytes less than 336"));
        return;
    }

    QByteArray arr = sItemValue.toLatin1();
    QVector<SCHEDULE_POSITION_T> vecSelectedItems;

    for(int i = 0; i < MAX_ITEM_COUNT; i++)
    {
        if(arr[i] == '1')
        {
            SCHEDULE_POSITION_T stPos;
            stPos.nRow = i/(COLUMN_COUNT-1) + 1;
            stPos.nColumn = i%(COLUMN_COUNT-1) + 1;
            MY_DEBUG << "setItemSelectByString i"  << i << " nRow:" << stPos.nRow << ", nColumn:" << stPos.nColumn;
            vecSelectedItems.push_back(stPos);
        }
    }
    setItemSelectByPos(vecSelectedItems);
}

四、demo源码下载

https://download.csdn.net/download/linyibin_123/88059521

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

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

相关文章

CMake基础入门

文章目录 一、一个目录下有一个源文件&#xff08;入门&#xff09;1.1 预定义的变量1.2 语法介绍cmake_minimum_requiredprojectsetmessageadd_executable 1.3 最基础的实例1.4 第一步优化&#xff1a;build目录实操流程 1.5 第二步优化&#xff1a;src目录1.5.1 实操流程1.5.…

用心做好一款堡垒机,升级版《新一代堡垒机建设指南》白皮书现已开放下载!

编者注&#xff1a;本文刊登在《新一代堡垒机建设指南》&#xff08;JumpServer v3.0发布纪念版&#xff09;序言部分&#xff0c;文章作者为JumpServer开源堡垒机项目创始人广宏伟。点击文章底部“阅读原文”链接&#xff0c;即可下载新版《新一代堡垒机建设指南》白皮书。 “…

Vue3 – 实现过渡动画

1 认识Vue的动画原理 2 动画中常见类的作用 3 animation动画实现 4 动画的常见属性设置 5 列表元素动画组实现 6 列表元素的移动动画 认识Vue的动画原理 利用transition标签和一系列的动画类来控制标签的动画效果。 transition标签的本质是帮你添加和删除动画类的。 trans…

SpringBoot整合EasyExcel实现读操作

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合EasyExcel实现读操作 ⏱️ 创作时间&#xff1a; 2023年…

linux中的sendmail发送邮件

Linux/UNIX 下的老牌邮件服务器。 Sendmail 作为一种免费的邮件服务器软件&#xff0c;已被广泛的应用于各种服务器中&#xff0c;它在稳定性、可移植性、及确保没有 bug 等方面具有一定的特色&#xff0c;且可以在网络中搜索到大量的使用资料。 一、邮件发送原理图 MUA&#x…

通过弹性算力支持与托管式机器学习服务,亚马逊云科技为客户提升技术竞争力

时下数字化浪潮中&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;已成为企业实现业务增长和数字化转型的重要技术&#xff0c;为企业提供了重新定义和调优业务模式的机遇。越来越多的企业希望利用人工智能技术提升竞争力&#xff0c;应对复杂的商业环境和市场挑战&…

机器学习实战:Python基于Ridge岭回归进行正则化(十三)

文章目录 1.前言1.1 岭回归的介绍1.2 岭回归的应用 2.自定义数据集实战演示2.1 导入函数2.2 创建数据集2.3 alpha0、1、10、100的分别情况 3.Dushanbe_house数据集实战演示3.1 导入函数和数据3.2 剔除空值及可视化3.3 整理数据3.4 训练和测试数据集3.5 评估数据集 4.讨论 1.前言…

mysql更新关联字段问题

现象 ### 表结构 CREATE TABLE wjf_test_update_num (id bigint(20) NOT NULL AUTO_INCREMENT,num1 int(11) DEFAULT NULL,num2 int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT3 DEFAULT CHARSETutf8 |## 插入两行数据 insert into wjf_test_update_nu…

从源码理解Scala中函数reduceRight的计算过程

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 以List集合为例&#xff0c;进行reduceRight()的计算过程分析&#xff0c;总体分为两部分&#xff0c;一部分是看最顶层特质的那个通用的reduceRight方法&#xff0c;另一部分是讲直接混入的特质的…

【Linux】分布式存储系统 Ceph

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 分布式存储系统 Ceph Ceph 概述1、Ceph 简介2、存储基础3、Ceph 优势4、Ceph 架构4、Ceph 核心组件5、OSD 存储后端6、Ceph 数据的存储过程7、Ceph 版本发行生命周期 Ceph 集…

Day13 02-Linux常用命令汇总

文章目录 第三章 Linux的常用命令【重要】3.1 命令格式的说明3.2 帮助命令3.2.1 man3.2.2 help 3.3 文件处理命令3.3.1 cd3.3.2 ls3.3.3 pwd3.3.4 mkdir3.3.5 touch3.3.6 echo3.3.7 cp3.3.8 mv3.3.9 rm3.3.10 vi编辑器3.3.11 ln 3.4 查看命令3.4.1 cat3.4.2 more3.4.3 head3.4.…

代码量、代码行数计算工具

cloc 极客命令行工具 下载地址&#xff1a;https://github.com/AlDanial/cloc 常用命令&#xff1a; // 文件夹的名称 cloc ./StaticAnalyzer/计算结果&#xff1a; 速度快&#xff0c;结果精准&#xff0c;十分实用&#xff01;

51单片机学习--数码管显示

首先实现静态数码管显示 SMG表示共阴极 &#xff0c;要让第三位显示数字6&#xff0c;需要LED6端口接0&#xff0c;即Y50&#xff0c;5的二进制为101&#xff0c;按P2_4 到 P2_2 的顺序接&#xff0c;则CBA分别接101 然后在数码管另一端&#xff0c;需要点亮的接上1&#xff…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

客户案例 | 数字化加速,金融企业实现3D打印式应用程序开发

关键发现&#xff1a; 客户痛点&#xff1a;传统开发周期长&#xff0c;流程复杂&#xff0c;难以满足杭银消金在企业快速发展过程中的应用开发需求&#xff1b;内部业务因为优先级不高&#xff0c;导致开发资源分配有限&#xff0c;更加迟滞了管理部门数字化转型的进度。 解决…

大规模新能源并网下火电机组深度调峰优化调度

1主要内容 程序主要参考《大规模新能源并网下火电机组深度调峰优化调度》&#xff0c;建立了深度调峰基础模型&#xff0c;采用IEEE30节点系统&#xff0c;通过直流潮流建模&#xff0c;以火电机组运行成本、开机成本等综合运行成本最低为目标函数&#xff0c;包括潮流约束、旋…

Spring 能解决所有循环依赖吗?

以下内容基于 Spring6.0.4。 看了上篇文章的小伙伴&#xff0c;对于 Spring 解决循环依赖的思路应该有一个大致了解了&#xff0c;今天我们再来看一看&#xff0c;按照上篇文章介绍的思路&#xff0c;有哪些循环依赖 Spring 处理不了。 严格来说&#xff0c;其实也不是解决不了…

基于Python的汉字字频统计实验

完整资料进入【数字空间】查看——baidu搜索"writebug" 实验内容 针对不同语料统计汉字的字频&#xff0c;并进行比较。 实验要求和目的 给出前 100 个汉字高频字的频率统计结果&#xff1b; 分别给出前 1、20、100、600、2000、3000、6000 汉字的字频总和&…

makefile项目管理-规则和过程

目录 1、makefile基本规则 2、makefile执行过程 3、makefile的运行规则 1、makefile基本规则 &#xff08;1&#xff09;命名&#xff1a;makefile 和 Makefile &#xff08;2&#xff09;makefile文件&#xff1a;里面是多个命令的集合&#xff0c;使用make命令执行该文件 …

岩土工程安全监测振弦传感器的发展史

岩土工程安全监测振弦传感器的发展史 岩土工程安全监测是岩土工程学科领域的一个重要组成部分。随着科学技术的不断发展&#xff0c;传感器技术的应用也在不断地创新和完善。振弦传感器是一种重要的监测设备&#xff0c;其应用范围广泛&#xff0c;以其高灵敏度、高精度、长期…