h5日历组件制作

一、背景

当市面上诸如antd、element之类框架的日历组件无法满足需求时,只能考虑自己手写一个日历了。

在自己实现之前会觉得日期的展示这块不好处理,而实现过后会发现这块的处理逻辑很有通用性,无论是pc端还是移动端、vue栈还是react,都能套用同样的处理方式,其他的交互和自定义展示就没啥难度了,根据业务需要自己定制就行。

本文以react移动端日历组件为例,文末提供完整代码。

二、功能

可实现的功能有:

  • 默认展示当月日历
  • 可切换年或月
  • 可选中任意日期,支持多选
  • 可对任意日期进行特殊标记展示

了解代码思路后,你可以随意修改代码,功能随意拓展。

三、实现

1、dom结构和样式

日历是纵向按星期来对齐的,

星期栏单独一个容器,flex布局,里面7个元素平分:

const weekList = ['日', '一', '二', '三', '四', '五', '六'];

<div className={styles.weekBar}>
  {weekList.map((v) => (
    <div key={v} className={styles.weekCol}>
      {v}
    </div>
  ))}
</div>

.weekBar {
  display: flex;
  align-items: center;
  color: #666;

  .weekCol {
    height: 100px;
    width: 14.28571%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
}

日期列表参照 antd-mobile 的展示,固定6行,共42项,共用一个容器,和星期栏类似,flex布局,子元素占总宽度的1/7,溢出换行(flex-wrap: wrap)。

2、日期展示

前面日期列表的展示结构确定了,剩下的就是拿到42项日期的数组数据,然后遍历渲染dom即可。

我的思路是把这42项数据分成三部分,上月的部分数据 + 当前月的所有数据 + 下月的部分数据,拼接起来就是要展示日期表格数据。

  • 变量:
cYear // 所选的年份
cMonth // 所选的月份
  • 关键API:
new Date(cYeear, cMonth, 1) // 获取指定年月的第一天的日期对象
new Date(cYeear, cMonth, 0) // 获取指定年月的最后一天的日期对象
// 备注:cMonth比我们实际的月份小1,和getMonth()是对齐的,例如二月就是1;cMonth这里也可以传负值,API会智能计算,例如-1表示上一年的12月
  • 用到的函数:
// 获取指定年月的当月所有天的数组,例如:2022年8月得到的是[1,2,3,4,......,31]
const getDateListByMonth = (year, month) => {
  const days = new Date(year, month, 0).getDate();
  return new Array(days).fill(null).map((v, i) => i + 1);
}

// 获取指定年月的1号是周几,备注:
const getWeekOfFirstDay = (year, month) => {
  return new Date(year, month - 1, 1).getDay();
}
  • 上月的部分数据
    根据当前月的1号是周几,来判断需要取几条上月的数据,然后拿到上月的完整数据进行数组截取。特殊情况:如果1号是周日就取7条。
// 上月的部分数据
const week = getWeekOfFirstDay(cYear, cMonth);
const lastMonthNums = getDateListByMonth(cYear, cMonth - 1);
const preffixList = lastMonthNums.slice(week === 0 ? -7 : -week).map((v) => ({
  id: tools.formatDate(new Date(cYear, cMonth - 2, v), '{y}-{m}-{d}'),
  monthType: 'last',
  disabled: true,
  num: v,
}));
  • 当前月的全部数据
    当前月会完全展示,取完整数据。
// 当月的数据
const curMonthNums = getDateListByMonth(cYear, cMonth);
const currentList = curMonthNums.map((v) => {
  const vDate = new Date(cYear, cMonth - 1, v);
  const isRedDot = +vDate >= +todayZeroDate;
  const id = tools.formatDate(vDate, '{y}-{m}-{d}');
  return {
    id,
    monthType: 'current',
    disabled: false,
    chose: choseDateList.includes(id),
    num: v,
    isRedDot,
  };
});
  • 下月的部分数据
    总共展示6行7列,共42条数据,减去上述中上月和当前月的数据条数,就是下月数据里要截取的数量。
// 下月的部分数据
const nextMonthNums = getDateListByMonth(cYear, cMonth + 1);
const nextList = nextMonthNums
  .slice(0, 6 * 7 - preffixList.length - currentList.length)
  .map((v) => ({
    id: tools.formatDate(new Date(cYear, cMonth, v), '{y}-{m}-{d}'),
    monthType: 'next',
    disabled: true,
    num: v,
  }));
  • 数据字段解释:
{
  id, // 唯一标识,我这里格式为“2022-08-25”,方便取用
  monthType, // 月类型,分为:上月、当月、下月,备用
  disabled, // 是否置灰
  num, // 展示的日期数字
  isRedDot, // 是否展示红点标识
}

以上数据字段可以随意拓展,根据你的需要来对日历展示不同的状态、不同标记等,或者对日历点击事件做自定义的操作。

四、其他

1、农历

网上有一些公历转农历的插件,可以拿来用,例如:lunar-calendar,还包含传统节假日。

2、二十四节气

//计算节气
function getJQ(yyyy,mm,dd){
 var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);
 var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
 var tmp1 = new Date((31556925974.7*(yyyy-1900)+sTermInfo[mm*2+1]*60000)+Date.UTC(1900,0,6,2,5));
 var tmp2 = tmp1.getUTCDate();
 var solarTerms = "";
 if (tmp2==dd)
   solarTerms = solarTerm[mm*2+1];
 tmp1 = new Date((31556925974.7*(yyyy-1900)+sTermInfo[mm*2]*60000)+Date.UTC(1900,0,6,2,5));
 tmp2= tmp1.getUTCDate();
 if (tmp2==dd)
   solarTerms = solarTerm[mm*2];
 return solarTerms;
}

3、法定节假日

法定节假日的安排是国家每年不同时间制定颁布的,只能手动录入,没法预测计算,这个可以找一些第三方API,例如阿里云、腾讯云的一些服务,可能需要付费。

五、示例代码

import React, { useState, useEffect } from 'react';
import styles from './styles.less';
import tools from 'ut-utils';

const todayDate = new Date(); // 今日日期,实际项目中推荐从接口拿服务器日期用
const todayZeroDate = new Date(todayDate.getFullYear(), todayDate.getMonth(), todayDate.getDate()); // 今日零点的日期,用于后续转换时间戳后日期大小的比较

const weekList = ['日', '一', '二', '三', '四', '五', '六'];

export default Page = () => {
  const [cYear, setCYear] = useState(todayZeroDate.getFullYear());
  const [cMonth, setCMonth] = useState(todayZeroDate.getMonth() + 1);

  const [dateList, setDateList] = useState([]);
  const [choseDateList, setChoseDateList] = useState([]);

  const onChangeYear = (num: number) => {
    setCYear(cYear + num);
  };

  const onChangeMonth = (num: number) => {
    if (cMonth + num <= 0) {
      setCYear(cYear - 1);
      setCMonth(12 - (cMonth + num));
    } else if (cMonth + num >= 13) {
      setCYear(cYear + 1);
      setCMonth(cMonth + num - 12);
    } else {
      setCMonth(cMonth + num);
    }
  };

  // 获取指定年月的当月所有天的数组
  const getDateListByMonth = (year, month) => {
    const days = new Date(year, month, 0).getDate();
    return new Array(days).fill(null).map((v, i) => i + 1);
  };

  // 获取指定年月的1号是周几
  const getWeekOfFirstDay = (year, month) => {
    return new Date(year, month - 1, 1).getDay();
  };

  // 获取日期渲染数据
  useEffect(() => {
    // 上月的部分数据
    const week = getWeekOfFirstDay(cYear, cMonth);
    const lastMonthNums = getDateListByMonth(cYear, cMonth - 1);
    const preffixList = lastMonthNums.slice(week === 0 ? -7 : -week).map((v) => ({
      id: tools.formatDate(new Date(cYear, cMonth - 2, v), '{y}-{m}-{d}'),
      monthType: 'last',
      disabled: true,
      num: v,
    }));
    // 当月的数据
    const curMonthNums = getDateListByMonth(cYear, cMonth);
    const currentList = curMonthNums.map((v) => {
      const vDate = new Date(cYear, cMonth - 1, v);
      const isRedDot = +vDate >= +todayZeroDate;
      const id = tools.formatDate(vDate, '{y}-{m}-{d}');
      return {
        id,
        monthType: 'current',
        disabled: false,
        chose: choseDateList.includes(id),
        num: v,
        isRedDot,
      };
    });
    // 下月的部分数据
    const nextMonthNums = getDateListByMonth(cYear, cMonth + 1);
    const nextList = nextMonthNums
      .slice(0, 6 * 7 - preffixList.length - currentList.length)
      .map((v) => ({
        id: tools.formatDate(new Date(cYear, cMonth, v), '{y}-{m}-{d}'),
        monthType: 'next',
        disabled: true,
        num: v,
      }));
    // 拼接
    setDateList([...preffixList, ...currentList, ...nextList]);
  }, [cYear, cMonth, choseDateList]);
  
  // 点击选中日期的事件
  const onClickDate = (item) => {
    if (item.disabled) {
      return;
    }
    const index = choseDateList.indexOf(item.id);
    if (index === -1) {
      choseDateList.push(item.id);
    } else {
      choseDateList.splice(index, 1);
    }
    setChoseDateList([...choseDateList]);
  };

  return (
    <div className={styles.popupBody}>
      <div className={styles.info}>
        <p className="chosed">已选择 {choseDateList.length}</p>
      </div>
      <div className={styles.main}>
        {/* 切换年月栏 */}
        <div className={styles.topBar}>
          <div className={styles.topBarL}>
            <span onClick={() => onChangeYear(-1)}>--</span>
            <span onClick={() => onChangeMonth(-1)}>-</span>
          </div>
          <p className={styles.dateTxt}>
            {cYear}{cMonth}</p>
          <div className={styles.topBarR}>
            <span onClick={() => onChangeMonth(1)}>+</span>
            <span onClick={() => onChangeYear(1)}>++</span>
          </div>
        </div>

        {/* 星期栏 */}
        <div className={styles.weekBar}>
          {weekList.map((v) => (
            <div key={v} className={styles.weekCol}>
              {v}
            </div>
          ))}
        </div>

        {/* 日期栏 */}
        <div className={styles.dateWrap}>
          {dateList.map((v) => (
            <div
              key={v.id}
              className={`${styles.dateItem}
                ${v.disabled ? styles.grey : ''}
                ${v.chose ? styles.chose : ''}`}
              onClick={() => onClickDate(v)}
            >
              <div className={styles.numWrap}>
                <span>{v.num}</span>
                {v.isRedDot ? <i className={styles.dot} /> : null}
              </div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
};
.popupBody {
  background-color: #eaeaea;
  font-size: 14px;

  .info {
    padding: 12px;
    margin-bottom: 10px;
    background-color: #fff;
    line-height: 1.5;
  }
  .main {
    padding: 0 12px 12px;
    background-color: #fff;

    .topBar {
      display: flex;
      align-items: center;
      justify-content: space-between;
      height: 50px;
      border-bottom: 1px solid #f3f3f3;
    }
    .topBarL, .topBarR {
      display: flex;
      align-items: center;
      font-size: 16px;

      span {
        margin: 0 10px;
      }
    }
    .weekBar {
      display: flex;
      align-items: center;
      color: #666;

      .weekCol {
        height: 50px;
        width: 14.28571%;
        display: flex;
        align-items: center;
        justify-content: center;
      }
    }
    .dateWrap {
      display: flex;
      align-items: center;
      flex-wrap: wrap;

      .dateItem {
        height: 50px;
        width: 14.28571%;
        display: flex;
        align-items: center;
        justify-content: center;

        &.grey {
          color: #ccc;
        }
        .numWrap {
          width: 70%;
          height: 70%;
          border-radius: 50%;
          display: flex;
          align-items: center;
          justify-content: center;
          position: relative;

          .dot {
            display: block;
            position: absolute;
            bottom: 0;
            left: 50%;
            transform: translateX(-50%);
            width: 5px;
            height: 5px;
            background-color: red;
            border-radius: 50%;
          }
        }
        &.chose {
          .numWrap {
            background-color: #409eff;
            color: #fff;
          }
        }
      }
    }
  }
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
易语言是一门以中文作为程序代码编程语言,其以“易”著称,创始人为吴涛。易语言早期版本的名字为E语言。其最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践,方便中国人以中国人的思维编写程序,并不用再去学习西方思维。易语言的诞生极大的降低了编程的门槛和学习的难度。从2000年以来,易语言已经发展到一定的规模,功能上、用户数量上都十分可观。诞生背景 中国计算机应用的发展在经过操作系统汉化显示环境,中文输入法的两次较大跨越后,正经历一个重要的历史时期:中文化编程已成为当务之急。   英文编程软件只能使用英文输入程序代码,并且需要用户掌握大 易语言认证与推广照片 易语言认证与推广照片(17张) 量专业英文术语。   而且国人的述事习惯与外国人的语法习惯还有很大区别,如外国人表示"按从小到大顺序排",而中国人的表达方式为:"按从大到小方式顺序排"或简称"按降序排"。外国人的语法大多数是与中国人不同的,再加上英文有多种语态,有时间动词,有不同的复数形式,这在中国人学习外语上都不能很好的适应。更何况英文编程中大多数用大写缩写的方法表示一个概念、定义和变量,因此如果不了解的人是无从知道,而中文几个字即可简单表示了。中文具有比较明确的归类表达方式,如公交车、小汽车、自行车、吉普车均是行走的车辆,都与车有关,而英语每个事物都有一个不同的名词,不容易记忆,如BUS公交车,CAR小汽车,BIKE自行车,JEEP吉普车。因此这种方式如果套用到编程上,那么每个变量均用不同的代表,那样要记忆的词汇量就非常巨大了,有个对比,中国人只要掌握3000个字就能读名著,而外国人必须掌握30000个以上单词才能看明白报纸。因此小的记忆量可以适合在编程中只考虑方法,而不必过多地考虑语法、变量的名称等。而且由于中文是方块字,包含的信息量也大,能够见文知义。 通过以上,东西方文化的差异造成对编程学习上的很大区别,中文文化背景决定了中国人还是学自己的编程语言好。 [1] 市场推广 2004年易语言获得《科技查新报告》,《科技项目鉴定测试报告》 培训推广图册 培训推广图册(20张) ,《科技项目技术经济评议书》的认可。“易语言汉语编程环境”成功通过国家鉴定,易语言获2004年《大连市科学技术进步奖》二等奖。 2004年易语言正式走上讲台“吉林市计算机专业骨干教师培训班”,2004年7月11日至17日,在吉林市教育局的大力支持下,应吉林市教育学院职教部的邀请,易语言公司培训教师史世恒老师前往吉林,做为期七天的“吉林市计算机专业骨干教师培训班”教学活动。这是易语言与中等专业教育学校的首次合作,同时也为易语言走进教育事业迈向了可喜的一步! 2004 年7月28日-31日易语言参加软交会,大连大有吴涛易语言软件开发有限公司参加中国国际软件和信息服务交易会,展台位置在大连星海会展中心东22号门旁边,届时易语言将携简体中文版、繁体中文版、英文版、日文版向全世界展示! 2005年3月出版发行《易语言编程系统》由易语言公司组织、易语言教材编委会编写。本书按易语言4.0编写。 2005年4月21日中国教育学会中小学信息技术教育专业委员会和各专家领导参与的易语言在中小学项目的推介与申报项目会议在北京招开。 2005年8月3日,“易语言汉语编程环境”国家火炬计划证书已颁发,国家科学技术部火炬高技术产业开发中心颁发“易语言汉语编程环境”国家火炬计划证书。5月由该公司申报的“易语言汉语编程环境”项目已被立项。 2005年8月22日至2005年8月26日全国中小学计算机教育研究中心北京部主持易语言全国首次高级培训会,大连大有吴涛软件开发有限公司承办的易语言全国首次培训会在大连举行。 2005年12月26日,易语言在中小学实验与推广项目教师培训在美丽的 易语言在宁夏和云南 易语言在宁夏和云南(17张) 株洲隆重开题。 2005年易语言在中小学实验与推广项目已全面启动, 由中国教育学会中小学信息技术教育专业委员会(北京,普教系统)组织,易语言公司提供技术支持的"易语言在中小学实验与推广项目"已全面启动。 2006年1月10日-15日在浙江省首次举行中小学骨干教师开题培训。绍兴市中小学信息技术教育中心、绍兴县教师发展中心、绍兴柯桥中学承办了本次培训工作。 2006年由宁夏教育厅教研室和山东教育出版社编写的《初中信息技术·第3册下》已出版发行,全文讲解了易语言的程序设计方法。本教材已在宁夏的所有初中学校中使用。 2006年9月1日易语言公司参加南京软博会。公司随大连展团为期四天,参加在南京市举办的第2届中国(南京)国际软件产品博览会。 2006年10月26日-31日云南省易语言开题培训会召开。全国中小学计算机教育研究中心“易语言在中小学实验与推广项目”在云南省首次举行中小学以及职业高中骨干教师培训。 2006年12月14日,“易语言”项目培训工作在宁夏大学教育科学学院网络实验机房顺利举行。 2007年3月28日-4月1日1“易语言在中小学实验与推广项目”在大连市开题培训,全国中小学计算机教育研究中心“易语言在中小学实验与推广项目”于,在大连教育学院举行首次初中骨干教师培训。 十大自主创新产品奖 十大自主创新产品奖 2007年6月21日,中国软件自主创新论坛暨中国软件自主创新排行榜颁奖典礼在大连举行。“易语言汉语编程环境”获2007中国”十大自主创新软件产品奖。大连大有吴涛易语言软件开发有限公司的“易语言汉语编程环境”以软件自主开了一款全中文、全可视、跨平台的编程语言,在易语言及其编译器的设计与实现、可视化汉语编程的构建、提供多种语言版本等方面具有创新,在技术上居于国内领先地位,达到了当前同类产品的国际先进水平的原因被评为中国 “十大自主创新软件产品奖”。 2008年6月易语言第一部系统的视频学习教程《易语言百集教程》由世恒老师完成并发布。 2010年12月3日易语言运行时环境通过计算机病毒防治产品检验中心的安全检验,检验依据为:GA243-2000《计算机病毒防治产品评级准则》,检测结果:均未发现病毒。 [2] 语言组成编辑 支持库 易语言支持库类似于普通的程序的DLL文件。 这个支持库是易语言专用的,别的程序调用不了的,扩展名有fnr、fne、npk三种。 fnr、fne都是制作好的DLL文件,例如系统核心支持库、应用接口支持库。该类支持库一般由用户使用C++或Delphi制作,具体可以看易语言支持库开发手册。 npk属于易语言COM包装支持库,该支持库是引用COM包装库生成的,例如WebBrowser、Windows媒体播放器。该扩展名格式支持库可用记事本、写字板打开。该支持库可以由用户制作制作方法:在易语言上点击工具--“类型库或OCX组件→支持库”命令。 模块
◆免责条款: ======================================================================================================== *本作品仅作技术交流之用,所有资料来源于互联网,只可用于个人研究试验,切勿用于商业用途,请测试后自行销毁。 *Windows系统及软件版权属各自产权人所有。超出个人研究范围所引发的版权及责任等问题的争执, *您必须认可上述免责条款,方可使用本作品。如有异议,强烈建议不要使用。 ■概述: ================================================================================================ 本系统采用 MSDN 发行的 Microsoft Windows XP Professional SP3 作母盘,可通过微软验证,可在线更新,请放心使用 集成了SATA/RAID/SCSI最新驱动,支持ATI SB700/SB600 SATA AHCI/RAID支持更多的硬件,稳定性、兼容性超强,支持更多的硬件,恢复速 度更胜一畴!电源判断更准确,支持恢复系统到各种台式机、笔记本电脑、工作站、以及服务器。智能判断,自动卸载多余设备驱动。 ★系统特色: *系统安全补丁更新至2011年05月26日。 *更改IE浏览器为IE6 *更改为悦耳的开关机声音 *终极优化系统,减少无用的进程,确保系统运行更快速。 *破解 Tcpip 连接数限制,破解系统主题限制,并集成微软 JAVA 虚拟机。 *集成 DirectX0903,VBVC最新版本运行库。 *系统在完全断网的情况下制作,确保系统更安全。 *采用通过微软数字签名认证驱动并自动识别安装,确保系统运行更稳定。 ★已安装的软件(均更新到最新): ============================ + pptv网络电影 + 腾讯QQ2011 + *** 2003 + 酷狗音乐 + 极品五笔 2009 + 搜狗拼音输入法 ★驱动包简述: 1.综合驱动包以全面为主导,收集了大量目前流行的硬件设备驱动。 2.适用于WinXP_32Bit平台,部份驱动去除了对Win2000以及64Bit平台的支持。 3.包含硬件智能判断驱动选择程序及相关组件,可在桌面环境下全静默安装已解压的驱动。 4.在封装部署环境使用时,请在外部接口直接调用主程序即可。 5.本驱动包尽可能提供自发布日起最新流行硬件的支持。 ★支持驱动: [Chipset]芯片组驱动: ALi扬智/ULi宇力芯片组综合驱动 AMD AmdAway 超微芯片组系列驱动 ATi全系列南桥芯片组驱动 Intel英特尔全系列芯片组驱动 nVIDIA nForce 1-MPC79全系列芯片组驱动 SiS矽统全系列主板芯片组驱动 VIA威盛全系列芯片组驱动 NoteBook各种笔记本常用设备驱动 {other}其它芯片驱动: ASUS ATK0100/ATK2000系列驱动 Dell raid/sataraid驱动及红外线设备驱动 Transmeta全美达TM8000微处理器驱动 [Video]显卡驱动: ATi冶天Radeon 7000-HD4890系列显卡驱动(支持移动/专业版显卡, 含Hdmi) Intel英特尔830-GS4X系列显卡驱动(含移动版/含Hdmi,移至Others.7z压缩包) nVIDIA RIVA TNT--GTX295全系列显卡驱动(注:nf5以下为纯驱动) Matrox G系列/Millennium G系列显卡驱动 SiS矽统系列集成显卡驱动 VIA(S3)威盛系列显卡驱动(含S3GHDAudio) VMware虚拟机设备驱动(含显卡、声卡、网卡设备) {Other}其它显卡驱动: 3DFX Voodoo 3/4/5系列显卡SFFT驱动 3Dlabs Wildcat_VP/Wildcat_Realizm系列显卡驱动 XGI图诚Volari Z7/Z9/Z9s/V3/V3XT/V8/V5系列显卡驱动 DisplayLink DL-120/125/160/165/195 USB外置显卡驱动 PowerVR KYRO/KYRO II系列显卡驱动 Magic Control USB 2.0 VGA/Graphics Device显示驱动 NeoMagic NM2200 MagicMedia 256AV显卡驱动 [Audio]声卡驱动: Analog Devices AC97/HD全系列音频芯片驱动 ALi扬智/ULi宇力M5451/M5455 WDM音频芯片驱动 C-media骅讯CMI8330-9880 AC97/HD全系列音频芯片驱动 C-Media骅讯CM106/108/112/6501/cmusb系列USB声卡驱动 Conexant AC97/HD全系列音频芯片驱动 Creative创新Live5.1/LS/TP0033/sb_live/ks/kx系列音频芯片驱动 Microsoft HDAudio音频总线驱动 nVIDIA全系列音频芯片驱动 Realtek瑞昱AC97/HD/HDMI音频芯片驱动 SigmaTel矽玛特/IDT系列AC97/HD音频芯片驱动 SiS矽统7012/7018系列音频芯片驱动 VIA威盛Envy24/AC97/HD系列音频芯片驱动 {Other}其它声卡驱动: Avance Logic AC97/ALS007/ALS4000系列音频芯片驱动 Audiotrak Prodigy 7.1//HD2/AYA 44 MKII系列声卡驱动 CirrusLogic CS429x AC97 Codec系列声卡驱动 ESI Juli@朱丽叶/ESP1010/XD/l192X/192L/192M系列音频芯片驱动 ESS Canyon3D 2/ES1938-ES1989/Diamond MX400音频芯片驱动 Echo Indigo/Indigo io/Indigo dj系列声卡驱动 ForteMedia FM801声卡驱动5.00.1319For Win2000/XP InfraSonic Quartet专业声卡驱动 Yamaha雅马哈YMF724/740/744/753/754系列音频芯片驱动 OPTi 82C931芯片声卡驱动4.03.00.20.31 RME HDSP 9652/9632/FireFace400/800火系列音频芯片驱动 Hercules系列声卡驱动 M-Audio系列音频芯片驱动。 Terratec德国坦克EWS88 MT/D/MIC2+MIC8声卡驱动5.51b LabWay Xwave-QS3000A声卡驱动 [Network\name\Lan]网卡驱动: 3Com 全系列网卡驱动 AMD PCnet-Home Based系列10M/100M网卡驱动 ADMtek 系列网卡驱动 Agere 1310系列网卡驱动 Accton智邦系列网卡驱动 Asion亚迅PCMCIA 10/100网卡驱动 ATTANSIC钰硕L1/L2系列网卡驱动 Allied Telesyn安奈特系列网卡驱动 ASIX AX88140—88772系列网卡驱动 Broadcom博通系列网卡驱动 Cisco 系列网卡驱动 D-LINK友讯系列网卡驱动 Davicom 系列网卡驱动 神州数码DCN-530TX快速以太网卡驱动 Intel英特尔PRO100/1000系列网卡驱动 IC Plus IP100A/IP1000A网络芯片驱动 Marvell Yukon系列千兆以太网卡驱动 nVIDIA nForce 1-7系列网卡驱动 Netgear系列网卡驱动 Realtek瑞昱系列网卡驱动 SiS矽统SIS190/SIS191/900系列网卡驱动 Smc系列网卡驱动 TP-LINK普瑞尔TG-523/TF-3239系列网卡驱动 Topstar系列网卡驱动 ULi M5263 10/100M 集成网卡驱动 VIA威盛Velocity VT系列网卡驱动 Other\otr\lan其它一些网卡设备驱动…。 [Network\name\Wlan]无线网卡驱动: 3Com ***Connect系列无线网卡驱动 AboveCable宽讯时代系列无线网卡驱动 Accton智邦系列无线网卡驱动 Actiontec PRISM 系列无线网卡驱动 Aircard 555r/775系列无线上网卡驱动 ADMtek ADM8211无线网卡驱动 Agere 系列无线网卡驱动 Airgo 系列无线网卡驱动 AirLive WT系列无线网卡驱动 Allied 系列无线网卡驱动 ATHEROS 系列无线网卡驱动 Atmel 系列无线网卡驱动 Avm 系列无线网卡驱动 ANT安特嘉华A350/a360无线网卡驱动 BENQ明基AWL300/400系列无线网卡驱动 Blitzz 系列无线网卡驱动 Buffalo美禄可WLI系列无线网卡驱动 Broadcom博通系列无线网卡驱动 Bewan Wi-Fi PCI 300N无线网卡驱动 Cisco 系列无线网卡驱动 Corega WiND502 USB无线网卡驱动 D-Link友讯系列无线网卡驱动 EagleTec鹰泰ET-WG2000 无线网卡驱动 Envara 系列无线网卡驱动 GemTek PRISMPA 无线网卡驱动 Hardlink固网HL系列笔记本网卡驱动 Intel英特尔PRO/Wireless系列无线网卡驱动 INPROCOMM系列无线网卡驱动 Iodate 系列无线网卡驱动 Kinstone今视通KS-2006/2008PLUS无线网卡驱动 Marvell系列无线网卡驱动 Microsoft Wireless系列无线网卡驱动 Netgear系列无线网卡驱动 Novatel 系列无线网卡驱动 Ralink RT系列无线网卡驱动(含USB) Realtek瑞昱RTL系列无线网卡驱动 Remote系列无线网卡驱动 U.S.Robotics系列无线网卡驱动 SIS矽统SiS160/162/163系列无线网卡驱动 Smc 系列无线网卡驱动 TP-link普瑞尔TL系列无线网卡驱动 Ti 德州仪器无线网卡驱动 Thomson系列无线网卡驱动 Wlannds\IEEE 802.11g Wireless无线网卡驱动 VIA威盛VT6655/VT6656系列线网卡驱动(含USB版) Linksys WMP54G(VER:4)/WPC54GX系列无线网卡驱动 Wonda网达WD-WN9101(AR)/WD-WN9102系列无线网卡驱动 ZyDAS ZD1211B/U/P/1202系列无线网卡驱动 Other\otr\wlan其它一些无线网卡设备驱动…。 [Camera]摄像头驱动: {UsbCam} Mini-Cam USB Camera (SC-120)" USB PC Camera (SN9C201/SN9C202) ZSMC USB PC Camera (ZS0211) Vimicro USB Web Camera Vimicro 301/301H/302/vmc302/303/305/321 PC Camera Vimicro VC0323/326/PC Camera Vimicro USB2.0 UVC PC Camera (VC0301V) Sonix SN9C101/SN9C102/ SN9C103/105 Sonix SN9C102P/SN9C105/SN9C110/SN9C120 [PC Camera-168] Sonix 300/301/Series/305/325 Delux_b27/b28 PC Camera eMPIA USB 2.0 Video Devices EM27xx and EM28xx. eMPIA USB 2.0 PC CameraAC580/AC680/AC688. Ali M5602/M5603C USB2.0 Camera ViewSonic W2201 WebCam(VM302) Sunplus SPCA501C/PCA561 {NoteBook} 各种笔记本自带摄像头驱动(Acer、ASUS、Lenovo、Dell、hp、Samsung等) [Modem]调制解调器驱动: Agere系列解调器驱动 Aopen建基FM56系列调制解调器驱动 Conexant系列解调器驱动 ESS 系列调制解调器芯片驱动 Intel系列解调器驱动 JCG880系列解调器驱动 Motorola系列解调器驱动 SmartLink系列解调器驱动 Lucent系列解调器驱动 Sm600topic1系列系列解调器驱动 [MassStorage]磁盘阵列驱动: 包含Amcc(3ware)、Acard、Adaptec、Ali、Highpoint、JMicron、Intel、Lsilogic、Marvell、 Promise、IBM、ITE、ATi、nVIDIA、Qlogic、SiliconImage、SIS、VIA、Tekram等设备磁盘阵列驱动。 (注:部份驱动已整合到芯片组驱动中如:Intel、ATi、nVIDIA、SIS等) [Others]其他设备驱动: 飞利浦7130芯片电视卡的通用驱动 10MOONS天敏电视大师4(TM400)电视卡驱动 AMsun雅美森炫影200电视卡驱动3.4版 IMPRESS映派N-TV电视卡驱动 LifeView朗视TV Star电视卡驱动1.0.0.13 Acer宏基Aspire渴望T160台式电脑电视卡驱动 Acer宏碁Aspire 5530系列笔记本电脑电视卡驱动 Toshiba电视卡驱动 Lenovo联想F50电视卡驱动 Lenovo天骄TV电视卡及D.TV采集卡驱动 HP惠普Pavilion m7398 cnWinTV 88x电视卡驱动 Gamepad 通用游戏手柄驱动 Realtek瑞昱RTS5101/S5111/S5116 USB2.0读卡器驱动 Microsoft微软XBox 360外置HD-DVD光驱驱动 HP惠普 d325小型立式台式电脑键盘快捷键驱动 Intel英特尔G4X系列显卡驱动 {USB设备} INTEL芯片组USB驱动 SIS芯片组USB驱动 VIA芯片组USB驱动 usb2.0万能驱动程序 手机USB数据线驱动 综合驱动包更新说明: 1、更新Intel、nVIDIA、ATi、VIA芯片组驱动,添加并更新部份笔记本设备驱动。 2、声卡部份涉及更新或调整的驱动:VIA_HD、ADI、Sigmatel(IDT)、Realtek、C-Media 、Conexant、M-Audio等。其中Realtek系列AC97及HD部份沿用skyfree精简版并根据网友反馈对HD声卡部份作添加控制台到控制面板的调整。添加Echo、InfraSonic等声卡的支持。 3、显卡部份: 1)Intel830至915为skyfree精简纯驱动;添加945GC显卡的支持。更新G4X系列显卡驱动。 2)更新Ati显卡驱动为9.3版、Ati_FireGL驱动为8.583版;添加ATI Mobility HD 4000系列移动显卡及HD4770/HD4890显卡的支持。 3)nVIDIA_nf5以下为skyfree精简纯驱动并将驱动文件退回71.89版避免部份TNT显卡安装高版本驱动出现某些不预期错误,nVIDIA高版本显卡驱动更新为182.50版,保留控制面板常用功能及3D、PhysX物理等程序。添加全系列桌面及专业显卡支持 ,添加G/GT/GTX 100(M)系列显卡持。 4)重新调整VIA(S3)系列显卡驱动,修正VIA Chrome9 HC显卡不能设置分辨率问题;更新S3400/500系列显卡驱动为最新版。 5)添加3Dlabs/DisplayLink 等显卡的支持,精简Other\PowerVR、XGI_V3显卡驱动为纯驱动。 4、网卡部份进行了常规性更新,主要更新Broadcom、Intel、Realtek、Atheros、Marvell、Agere等网络设备驱动,并针对网友反馈专门加入了Hasee笔记本无线网卡驱动。 5、MassStorage、Modem部份,常规性更新Highpoint、JMicron、SiliconImage等控制器驱动,及添加一个HP笔记本的Modem驱动。 6、Camera摄像头:采用吉吉增补修正的摄像头驱动;保留笔记本自带摄像头驱动。 ◆本系统安装方法: 在启动计算机时立即按 Delete (Del)【删除键】进入 BIOS【基本输入输出系统】设置 2 选择 Advanced BIOS Features 【高级 BIOS 特性设置】,并将 First Boot Device (1st Boot) 【第一启动设备】根据需要设置为 CDROM 【光盘启动】。 具体操作:将光标移动到 First Boot Device (1st Boot),按 Enter 选择CDROM.在按ESC.再按F10保存退出.如果保存不了CDROM 【光盘启动】。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ①AWARD BIOS设置光驱启动方法: 开机按DEL进入此界面,选第二项,回车 BIOS的界面版本并非完全一样,所以这几个图和您的实际机器可能会稍有出入,仅供参考! 选中此项,按PAGEUP 或PAGEDOWN选择, 设置为CDROM,C,A即为光驱启动 按ESC键退出,按F10保存,选YES回车 ②PHOENIX BIOS设置光驱启动方法: ③AMI BIOS 设置光驱启动方法: 进入后可看到【Floppy-软驱启动;Hard Disk-硬盘启动;CDROM-光驱启动】按方向键将方框移动到CDROM(光驱启动)后面按下回车,此时First Boot Device后面已经变成了CDROM,按F10键,保存并退出CMOS设置。此时将系统安装盘或是带有引导系统的光盘放入光驱内,重新启动电脑就会先读光盘。 因为BIOS的界面版本并非完全一样,所以这几个图和您的实际机器会稍有出入,但大致相同,可参考!!! 1、光盘安装(推荐) A.自动安装 安装请在BIOS中设置从光盘启动,然后进入光盘启动菜单,选择菜单第1项(A)就可以自动安装! B. 手动安装 把光盘下的***文件复制到硬盘,然后重启设置光盘启动,然后选择手动***11就可以手动操作 ***进行安装! 2、硬盘安装 =========================================================== 用虚拟光驱软件加载本镜像ISO文件,打开我的电脑,会出现一个A:盘,打开A盘运行里面的 AUTORUN.EXE这个程序,在弹出的菜单中选第一项即可实现全自动安装系统! 光盘刻录及使用的一些共性问题: =============================================================== 问:***复制文件过程***现A:\***ERR.TXT错误! 解答:这是***软件复制数据的过程中读写出错,就弹出一个对话框,大意是保存出错信息到A盘里。既然是读写出错,那直接原因就是光盘不好读,或者是光驱不好用。这是最普遍的情况,换张光盘或换个光驱再试,一般就OK了! 一般出现A:\***ERR.TXT错误有以下几种情况: 1.ISO文件正确或者ISO下载不完整,无论什么方式下载一定要校验MD5码 2.光盘质量:因购买光盘或者刻录盘质量有问题而导致恢复失败 3.光驱质量:因为光区激光头老化读盘能力下降而导致恢复失败 4.刻录机:因为刻录机刻录质量不好或老化导致刻出的盘质量有问题而导致恢复失败 5.刻录方式:因刻录速度过快导致光盘不好读,建议刻录时选择16X/24X速度一次刻录 6.超刻:因超过刻录盘容量而导致部分数据不完全引起的恢复失败,一般在680M内适宜 7.硬盘有坏道:因为坏道导致***无法写入 8.硬盘问题:完整的格式化一遍C盘,不要加Q(例:format c:) 9.硬盘没有盘符:因病毒或者其它以外导致的分区表丢失引起的恢复失败 10.超频:因为超频不稳定导致的恢复失败 如果排除以上问题,仍读盘错误,则可能是其它硬件问题.一个完整的硬件系统由许多部件组成,它们是一个有机的整体.如果某个关键部件品质不稳定,则整机就运行不稳定.在这样的系统里运行***,自然会出错.按经验,首先应该怀疑内存,应更换内存试试.双条内存的兼容性.其次,检查主板,硬盘(及其数据线),再留意一下CPU的发热量是否正常.由于每个人都有自己的经验和方法,这里仅点到为止. 很多品牌机上就存在这个问题,在主分区之前隐藏一个厂商安装好的分区用于整机系统检测的,因此在品牌机上进行***时应将注意这个问题. 不要出现这个错误,就说系统垃圾什么的,请先看资料,不要在说出那么无知的话. ◆免责条款: =========================================================== 本Windows系统及软件版权属各自产权人所有,只可用于个人研究交流使用,不得用于商业用途,且系统制作者不承担任何技术及版权问题,请在试用后24小时内删除。如果您觉得满意,请购买正版
制作垂直轮动组件,可以使用Qt自带的QScrollBar和QScrollArea组件。 首先,在Qt Designer中创建一个QScrollArea,并将垂直滚动条的范围设置为0到1。然后将一个QWidget作为QScrollArea的子组件,将其大小设置为QScrollArea的大小。 接下来,创建一个QVBoxLayout并将其设置为QWidget的布局管理器。在QVBoxLayout中添加需要显示的所有结果控件,并设置它们的大小和位置。要让结果控件能够滚动,可以将它们添加到一个QWidget中,并将该QWidget设置为QVBoxLayout的子组件。 最后,将QWidget添加到QScrollArea中,并将QScrollArea设置为垂直滚动条的父组件。 在代码中,可以使用以下方式创建并显示垂直轮动组件: ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QScrollArea, QScrollBar app = QApplication([]) window = QWidget() # Create scroll area scroll = QScrollArea() scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) scroll.setWidgetResizable(True) scroll.setFixedWidth(400) scroll.setFixedHeight(200) # Create widget and layout widget = QWidget() layout = QVBoxLayout(widget) layout.setContentsMargins(0, 0, 0, 0) # Add labels to layout for i in range(20): label = QLabel('Result {}'.format(i)) layout.addWidget(label) # Add widget to scroll area scroll.setWidget(widget) # Add scroll area to window layout = QVBoxLayout(window) layout.addWidget(scroll) window.show() app.exec_() ``` 这样就可以创建一个垂直滚动的组件,并在其中显示所有结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值