解决删除文件时出现 “文件夹中的文件已经在另外一个程序中打开,请关闭该文件夹,然后重试” 问题

1、出现问题

软件安装失败后,在删除文件的时候,有时会出现无法删除的情况:

说的文件夹中的文件已经在另外一个程序中打开,请关闭该文件夹,重试。其实这样我们也不知道到底哪里出现问题了,那个文件或文件夹被什么程序占用,此时都不知道。下面给出解决方法。

2、解决方法 

(1)打开任务管理器(ctrl+shift+esc),选择性能栏。

(2)打开资源监视器

(3)选择CPU这栏,并且搜索无法删除的文件夹名。(以bin64文件夹为例)

   从这可以看出,搜索到两条结果。

(4)下面只需要结束占用的进程。

此时可能会出现黑屏或者windows界面无响应,别慌,按照下面步骤恢复桌面:首先找到任务管理器。

  • 任务管理器上方有一个文件按钮—点击运行新的任务选择按钮

  • 输入cmd进入命令窗口,然后输入explorer,回车

   桌面恢复到原样windows界面。

(5)选择刚才要删除的文件夹或文件

  • 22
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
本资源由大量的实用批处理文件组成,删除.txt尾缀名双击即可直接使用,既是学习的模板也可以作为实用程序,如下为文件组成,涉及文件管理,系统,网络,小工具等等: 0-reaname 2000XP停止打印.bat BAT珍藏 dir.bat new_恶搞别人一下,在下次启动计算机会自动关机。。。重起后恢复正常(“绿色版”).bat reaname.bat sxs.exe 的查杀.bat sz.reg转换成reg.bat.bat 倒记(全屏).bat 全盘删除所有文件夹下的_desktop.ini.bat 删除大小和类型一样的文件.bat 删除所有分区的默认共享.bat 制作超大文件.bat 参考.bat 变量截取实例.bat 字符串提取&替换等操作 将cwindows.复制到当前目录并显示进度.bat 屏幕炸弹.bat 弹出对话框.bat 打开快捷方式指向的目录.bat 批处理加密.bat 批处理蠕虫.bat 批处理解密.bat 批处理读注册表的Run下面的值.bat 按扩展名分类.bat 数值计算 文件创建&改名等操作 显示c盘~z盘.bat 枚举当前目录及子目录大小.bat 枚举显示.bat 查找最新的文件.bat 格式转换 模拟黑客帝国数码雨.bat 每个目录占用的空间.bat 清除威金(logo_1,熊猫烧香)病毒最新变种工具.bat 篮球飞人火爆版.cmd 系统优化 系统信息查询&修改 系统类 结束进程.bat 综合性脚本 网络类 获取路径 解锁注册表.BATbat 超级硬盘杀手.bat 输出倒文.bat 锁注册表.BATbat 随机数.bat 颜色.bat 2000XP停止打印.bat ARP本机绑定.bat cdd.cmd CMD命令速查手册.cmd C盘防毒批处理.bat debug生成取色按钮程序.cmd dir.bat IE主页修改.bat jacksi.bat QQ精简.cmd sxs.exe 的查杀.bat sz.reg转换成reg.bat.bat WinPE 专用安装工具.cmd XP服务优化批处理.bat 不显示输入密码.cmd 与某人的QQ临对话.cmd 文显示ping结果.bat 交换两个变量的值而不使用临变量.cmd 修改IP跟电脑名.bat 全盘删除所有文件夹下的_desktop.ini.bat 删除大小和类型一样的文件.bat 删除所有分区的默认共享.bat 判断光驱里有无光盘.bat 判断分区格式.bat 加密代码.cmd 变色+翻滚字符.cmd 变量的多级嵌套.cmd 右键添加打开MS-DOS.bat 娱乐进度条.cmd 对加密的代码进行解密处理.cmd 将cwindows.复制到当前目录并显示进度.bat 感情进度条.bat 打开快捷方式指向的目录.bat 批处理生成图片.cmd 批处理读注册表的Run下面的值.bat 批量文件CAB 打包工具.cmd 按扩展名分类.bat 搞笑开机.bat 改变我的文档路径到D盘.bat 改变窗口颜色并显示当前颜色代码.cmd 断开网络联结.bat 星光闪烁.cmd 显示c盘~z盘.bat 显示当面途径DIR.bat 显示用户名.bat 显示翻滚字符.cmd 显示自己的IP.bat 显示进度.cmd 最小化运行批处理.cmd 枚举当前目录及子目录大小.bat 枚举显示.bat 查找最新的文件.bat 查杀效果图.bat 查看物理内存.bat 查看用户是否存在.bat 查看电脑硬件信息.bat 查看网关的MAC地址.bat 查看进程使用的端口.bat 查看驱动器.bat 检查网络信息.bat 模拟2K开机进度条.cmd 每个目录占用的空间.bat 测试网络是否通畅.cmd 画圆角矩形框.cmd 百度关键字搜索.bat 禁止保留文档记录.bat 篮球飞人火爆版.cmd 绑定网关的批处理及预留维护提到.bat 结束进程.bat 给每个盘添加卷标.cmd 维护版.bat 网络PING包查询.bat 自动改回主页.bat 自定义配置网络ip、网关、dns.bat 解锁注册表.BATbat 计算机名DNS网关IP(用来学习。不见得有效。).bat 读心术P处理版.cmd 输出倒文.bat 输出金字塔.cmd 进入全屏幕界面.cmd 进度特效.cmd 锁注册表.BATbat 防ARP.bat 飞入+变色字.cmd 黑客帝国里数码雨.cmd 下一行数字和上一行显示在同一行.cmd 保留空行替换字符串.cmd 列举水产品最高&最低价记录.cmd 删除重复行.cmd 去掉字符串不同部位的空格.cmd 去掉字符串头所有的0.cmd 反序列出文本的每行内容.cmd 反序显示输入内容.cmd 多行文本拼接成一行.cmd 把指定文件的指定位置的数字相加.cmd 把首行和尾行互换.cmd 拼接相临的奇偶行文本内容.cmd 提取两个文件内容的不同之处.cmd 文本内容互换.bat 显示只有指定个数字符的行.cmd 显示某两个字符及其之间的字符.cmd 显示随机的5个数.cmd 查找偶数行内容.cmd 查找行一个数字串.cmd 检测IP格式是否正确.cmd 每6行拼接为一行.cmd 理解字符截取功能.cmd 生成0-99之间的随机数列.cmd 用指定字符替换指定内容.cmd 用某行内容替换特定字符.cmd 统计重复次数并排序.cmd 计算字符串长度.cmd 读取带敏感字符的行.cmd 输出指定行的内容.cmd 过滤敏感字符.cmd 过滤相同行内容.cmd 还原从QQ上复制下来的内容.cmd 逐行逐字显示文本.cmd 两整数相除的批处理.cmd 九九乘法表.cmd 九宫格图案.cmd 勾股数算法.cmd 去掉数值可能存在的负号.cmd 去最大最小值后求剩余数组平均值.cmd 对数字进行排序.cmd 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和最小公倍数.cmd 用随机数做四则运算.cmd 百钱买百鸡的买法.cmd 计算2的N次方.cmd 计算开方.cmd 计算正浮点数的和.cmd 计算花费的间.cmd YS从桌面复制文件到其他地方.bat 乱序重列某类文件.cmd 今天访问过的程序文件所在目录.cmd 以文件夹名为名建立文本文件.cmd 全盘删除每个文件夹下的指定文件.cmd 全盘搜索指定文件.cmd 全盘查找QQ.exe并执行.cmd 创建url格式的快捷方式.cmd 删除N天之前文件.cmd 删除当前目录下及其子文件夹所有的空文件夹.cmd 删除所有以数字命名的文件夹.cmd 删除指定文件夹之外的其他文件夹文件.cmd 删除某些文件夹之外的目录.cmd 判断是文件还是文件夹.cmd 在所有文件夹下建立随机文件.cmd 对含有数字的文件进行改名操作.cmd 建立回收站.cmd 按软件分类建立文件夹.cmd 探测空文件夹.cmd 提取文件(夹)属性.cmd 改名复制文件.cmd 文件数目分类统计.cmd 替换系统主题.cmd 比较两个文件夹文件名的异同.cmd 清空指定大小的文件夹.cmd 系统文件替换.cmd 老外写的系统文件替换.cmd 获取某路径下的所有文件名.cmd 限制条件批量建立文件夹.cmd reaname.bat 文数字转换为阿拉伯数字.cmd 人民币大小写互转程序.cmd 人民币金额小写转大写.cmd 十进制转二进制.cmd 十进制转十六进制.cmd 字母大小写转换.cmd 把秒转换为天小分秒的格式.cmd 阿拉伯与罗马数字互转程序.cmd 阿拉伯数字转为罗马数字.cmd C盘个人资料转移器 IE修复.cmd Windows安全优化小助手.cmd XP安全设置补丁批处理 XP自动优化批处理文件3 全盘禁止运行指定程序 关闭无用的服务 删除历史记录.bat 删除右键“新建”菜单项目.bat 删除默认共享.bat 多功能系统优化设置.cmd 快速清理垃圾文件安装修改版 系统补丁自动升级.cmd 系统补丁自动安装.cmd Desktop Favorites My Documents OE shell.bat SHELL Shell Temp 简介 svc2kxp深山红叶汉化版本.cmd 介绍 lmod OptimizeXp.bat list 全盘禁止运行指定程序.cmd 2003优化文件.bat 关闭无用的服务(XP).bat install.CMDcmd 快速清理垃圾文件.bat 注册右键 判断驱动器类型.cmd 定关机.cmd 打开控制面板的某项.cmd 打开系统属性.cmd 提取用户列表.cmd 收集系统信息.cmd 改IP;网关;CDKey;网络号.cmd 显示各分区剩余空间情况.cmd 显示所有分区的剩余空间(以MB为单位).cmd 显示本机用户帐号信息.cmd 显示磁盘分区数.cmd 查看开机自启动程序的完整路径.cmd 查看电脑硬件信息.bat 检测光驱是否有盘.cmd 添加环境变量.cmd 解析ipconfig命令输出通用函数.cmd 调用系统气泡.cmd 通过inf重启电脑.cmd C盘转换为NTFS格式.cmd dos下重启.bat guest.bat win2000关机命令.bat WIN2003 IIS最小权限分配.bat winxp修改计算机名.bat xp下确定最后的盘符.bat 不显示扩展名.bat 不显示隐藏文件.bat 使用WMI别名获取CPU信息.bat 关闭IDE通道检测.bat 列举进程.bat 判断光驱是否可用.bat 判断光驱里有无光盘.bat 判断分区格式.bat 刷新策略.bat 取得硬盘数.bat 右键添加bat.bat 右键添加打开MS-DOS.bat 弹出光驱.bat 改变我的文档路径.bat 显示扩展名.bat 显示用户名.bat 显示隐藏文件.bat 更改电源管理方式.bat 更改盘符.bat 更改系统启动菜单的间.bat 查看工作组.bat 查看物理内存.bat 查看用户是否存在.bat 查看电脑硬件信息.bat 查看驱动器.bat 禁止保留文档记录.bat 给每个盘添加卷标.cmd 被锁定帐户.bat 重命名administrator账号.bat IE 界面批处理通讯录.cmd Tel XP安全设置补丁批处理 公交线路查询 文件备份器 文件归类整理器 英汉互译器 身份证信息查询 bg Tel svc2kxp.cmd svc2kxp深山红叶汉化版本.cmd 介绍 公交线路 公交线路查询.bat 数据库获取地址 readme 文件备份器V2.3修改版2.cmd 文件归类整理器 V1.1(子目录版).bat 文件归类整理器 V1.1(指定路径带子目录版).bat 文件归类整理器(当前目录版).bat 英汉互译.bat 英汉互译 计算机与网络英汉对照词典 词库 词库格式举例 date 身份证信息查询.cmd 身份证号码格式 文显示ping结果.bat 断开网络联结.bat 显示网络配置.bat 显示自己的IP.bat 查看网关的MAC地址.bat 查看进程使用的端口.bat 检查网络信息.bat 百度关键字搜索.bat 自动改回主页.bat 自定义配置网络ip、网关、dns.bat 98下获取当前路径.cmd 分离路径和文件名.cmd 抛弃路径尾部指定层次的字符串.cmd 按创建间显示完整路径.cmd 获取当前目录名.cmd 获取指定层次的目录名.cmd 获取相对路径.cmd 获取路径指定层深的字符串.cmd
300个注册表优化修改文件 经过了半个小终于弄完了,希望能对大家有所帮助 如果怕弄不好注册表就先给注册表备份1下,介绍几个个手动备份的方法:} 1.win98下在DOS下scanreg/backup(备份)scanreg/regore(恢复) scanreg/fix(修复) 2.打开regedi.exe文件,然后手动导出整个注册表文件为*.reg,想恢复直接双击这个*.reg 3.在运行下进入msconfig里然后选择常规后,创建备份和还原备份K 4.不完全注册表恢复,XP和2000重起机器按F8进入,选择上1次正确配置F Office的亲密接触: 点击浏览该文件 改变Word文档日期的显示格式.reg 将Word插入对象的名称汉化.reg 设置Office的安装位置.reg 设置Word文件保存路径.reg 设置是否显示Office助手.reg 安全与限制 : 点击浏览该文件 从浏览清单隐藏服务器.reg 给屏幕保护都加上密码.reg 关闭最近文件夹使用间.reg 解除屏幕保护密码.reg 禁用打印机删除打印机.reg 禁用打印机的添加打印机.reg 禁用控制面板.reg 禁用任务管理器.reg 禁用添加删除程序.reg 禁用文件夹选项菜单.reg 禁用用户追踪功能.reg 禁止打印机共享.reg 禁止对任务栏位置进行改变.reg 禁止改变打印机设置.reg 禁止更改IE的辅助功能设置.reg 禁止更改控制面板和打印机.reg 禁止光标闪烁.reg 禁止将最近访问过的共享资源添加到网上邻居里.reg 禁止密码缓存.reg 禁止使用inf文件.reg 禁止使用MS-DOS方式.reg 禁止使用拨号网络.reg 禁止使用鼠标右键.reg 禁止使用网上邻居.reg 禁止使用自动升级功能.reg 禁止添加打印机.reg 禁止系统检测网络的连接速度.reg 禁止显示前一个登录者的名字.reg 禁止向“开始”的“文档”保留历史记录.reg 禁止修改控制面版.reg 禁止修改显示属性.reg 禁止用户调整桌面工具栏的长度.reg 禁止用户改动桌面工具栏.reg 禁止用户使用reg文件.reg 禁止远程修改注册表.reg 禁止运行任何程序.reg 禁止在网络显示标识属性.reg 屏蔽掉添加打印机项.reg 屏蔽所有的系统热键.reg 设置密码的安全要求.reg 系统启动禁用计划任务.reg 系统启动运行可执行程序.reg 移去Windows XP的共享目录.reg 增加驱动程序的识别级别.reg 找回“丢失”的运行、注销和关闭系统.reg 只允许用户使用特定的屏幕保护.reg 指定密码的最小长度.reg 个性化你的IE和OUTLOOK : 点击浏览该文件 打造个性化的IE.reg 定制IE的文字大小.reg 定制IE字体的大小.reg 改变IE的默认下载目录.reg 更改Outlook Express的标题栏.reg 解决IE首页无法更改的问题.reg 禁止IE播放视频.reg 禁止IE的代理服务器.reg 禁止IE浏览器的脚本调试程序.reg 禁止IE浏览器的升级检查.reg 禁止IE显示图片.reg 禁止IE自动安装组件.reg 禁止Outlook Express用户打开可能包含病毒的附件.reg 禁止打开保存带病毒的Outlook邮件.reg 去掉IE内的分级审查口令.reg 让IE多线程下载.reg 设定IE的Cookies目录.reg 设置IE的Cache目录.reg 设置IE的历史目录.reg 设置IE的起始页.reg 设置IE的收藏目录.reg 设置IE发生错误是否允许报错.reg 锁定IE的下载功能.reg 修改IE的标题栏.reg 修改IE的产品ID.reg 修改默认的E-mail地址.reg 增加IE的自动识别功能.reg 个性化你的系统 : 点击浏览该文件 不显示开始菜单收藏夹菜单.reg 不显示上次登录的用户名.reg 打造独具特色的电脑标识.reg 调整Windows XP的浏览速度.reg 定制进入Windows前的欢迎信息.reg 改变菜单及工具提示的转换效果.reg 改变窗口变化的动感效果.reg 改变光标的闪烁速度.reg 改变回收站的名称.reg 改变下拉菜单的对齐方式.reg 改变桌面图标的大小.reg 个性化设置计划任务.reg 给当前文件文件夹换换颜色.reg 更改“我的公文包”的图标.reg 更改【回收站】满的候的提示信息.reg 更改Internet Explorer的图标.reg 更改打印机图标.reg 更改登录的背景图案.reg 更改控制面板的图标.reg 更改设备管理器的硬件设备名称.reg 更改设备管理器的硬件设备图标.reg 更改收件箱的图标.reg 解决Windows98第2版无法升级到Windows 2000的问题.reg 禁止使用任务栏.reg 快捷方式四个字不在了.reg 扩展鼠标右键功能.reg 密码提示语.reg 去除工具栏提示.reg 让Windows字体更平滑.reg 让点击这里开始的提示信息消失.reg 让计算机以12小制显示间.reg 任何地方都可以清空回收站.reg 如何设置优化页面文件.reg 如何在桌面上显示Windows版本标志.reg 删除开始菜单的注销选项.reg 设置CD-ROM的缓存区.reg 设置关机对话框的选项.reg 设置开始菜单使用多页面显示.reg 设置如何拖动整个窗口.reg 设置鼠标缓冲区.reg 设置图标之间的垂直间距.reg 设置文件系统的缓冲.reg 使窗口做到自动刷新.reg 使用64位真彩色.reg 文件测试.reg 修改Windows XP的版本号.reg 以高彩色分辨率显示图标.reg 隐藏桌面上的所有图标.reg 隐藏桌面上所有图标.reg 在启动计算机运行屏幕保护程序.reg 在鼠标右键菜单增加重新启动计算机的功能.reg 找回丢失的频道栏.reg 拯救你的任务栏.reg 自动关闭计算机.reg 自动设定显示器的刷新频率.reg 优化你的网络: 点击浏览该文件 改变下载的路径.reg 加快上网速度.reg 控制拨号网络的密码保存.reg 屏蔽整个网络.reg 启用IP过滤功能.reg 启用路由功能.reg 清理访问网络邻居后留下的字句信息.reg 取出映射网络驱动器和断开网络驱动器.reg 去除网上邻居里的邻近的计算机项.reg 设置HTTP 1.1协议的支持.reg 设置WINS服务器解析超间.reg 设置浏览器Cache的大小.reg 设置慢速网络连接超间.reg 设置网络连接的超间.reg 设置自动拨号功能.reg 隐藏上机用户登录的名字.reg 系统优化: 点击浏览该文件 不让CD-ROM自动运行.reg 不显示远程管理.reg 彻底关闭Dr.Warson.reg 打开关闭启动优化功能.reg 调整Windows XP的浏览速度.reg 改进核心系统性能.reg 更改标准间的名称.reg 关闭硬盘空间不足发出警告.reg 关机自动清除文件记录.reg 关机自动删除交换文件.reg 恢复注册表禁用.reg 激活DOS的快速编辑模式.reg 计算机启动自动运行屏幕保护程序.reg 加快程序的运行速度.reg 加快程序运行速度.reg 加快关机速度.reg 简单明了的任务管理器.reg 将mp3的音质调整到96kbps.reg 进入Windows后自动打开数字小键盘.reg 禁用长文件的~字符.reg 禁用关闭系统.reg 禁止访问任务栏的属性.reg 禁止改变工具栏的内容.reg 禁止删除打印机.reg 开启CPU的二级缓存.reg 控制CD-ROM的自动播放.reg 快速重启计算机.reg 扩充回收站的鼠标右键功能.reg 屏蔽资源管理器文件菜单.reg 启用自动优化磁盘功能.reg 取消无用的登录.reg 取消重启计算机并切换到MS-DOS功能.reg 去掉Windows XP的自动更新功能.reg 让Windows退出保存环境设置.reg 让程序在单独的内存空间运行.reg 让电脑跑的更快.reg 让电脑运行得更快.reg 让光标不再闪烁.reg 让系统还原占用的磁盘空间更小.reg 如何提高软驱的性能.reg 删除文档菜单的我的文档选项.reg 设定开始菜单文档的显示数量.reg 设定蓝屏自启动.reg 设置DOS下的自动填充命令.reg 设置Windows的安装路径信息.reg 设置窗口的缩放控制.reg 设置禁用活动桌面.reg 设置鼠标的滚动行数.reg 设置拖动整个窗口.reg 设置显示文件的扩展名.reg 设置在我的电脑显示打印机.reg 鼠标自动激活当前窗口.reg 缩短关闭无响应程序的等待间.reg 提高光驱的读写能力.reg 提高历史缓冲区的个数.reg 提高软驱的性能.reg 提高显示器刷新频率.reg 停用Windows文件高速缓存.reg 退出保存环境设置.reg 完全禁用系统还原.reg 消除软件显示乱码.reg 修改键盘缓冲大小.reg 修改默认CD播放器.reg 修改我的电脑的名称.reg 修正快速关机引起的问题.reg 延长Windows终止服务间.reg 隐藏我的电脑的驱动器.reg 隐藏资源管理器工具栏上的搜索按钮.reg 用其他方式打开我的电脑.reg 用文件管理器打开我的电脑.reg 优化硬盘驱动器.reg 在Windows下修改nVIDIA显卡的Direct3D刷新率.reg 在开始菜单添加注销项.reg 在软驱的右键菜单增加“清空A盘”的命令.reg 在右键菜单添加关闭计算机命令.reg 增加鼠标缓冲区.reg 找回安装密码.reg 拯救任务栏.reg 自动终止锁死程序.reg 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 注册表被锁和一些常用东西被限制解锁 注册表紧急解锁 显示运行、注销、网上邻居、控制面板等 有些注册表REG文件根据你的情况而自己手动修改 有需要的就拿去吧``做人要厚道一点 下了帮顶一下
McAfee(R) VirusScan(R) Enterprise 8.0i 版 发行说明 Copyright (C) 2004 Networks Associates Technology, Inc. 保留所有权利 ==================================================================== - DAT 版本: 4382 - 引擎版本: 4.3.20 ==================================================================== 感谢您使用 VirusScan Enterprise 软件。 本文件包含有关这一版本的重 要信息。我们强烈建议您阅读整篇文档。 重要信息: McAfee 不支持软件预发布版本的自动升级功能。要升级为正式产品,必 须首先卸载现有版本的软件。 _____________________________________________________________________ 本文件包含的内容 - 新功能 - 更改的功能 - 安装和系统要求 - 测试安装 - 已解决问题 - 已知问题 - 安装、升级和卸载 - 与其他产品的兼容性 - Alert Manager (TM) - Common Management Agent - ePolicy Orchestrator(R) - GroupShield(TM) - ProtectionPilot(TM) - 第三方软件 - 访问保护 - 增添文件类型扩展名 - AutoUpdate - 缓冲区溢出保护 - 日志文件格式 - Lotus Notes - 镜像任务 - 扫描 - 有害程序策略 - 文档 - 参与 McAfee 测试程序的测试 - 联系信息 - 版权和商标归属 - 许可和专利信息 __________________________________________________________________ 新功能 本版本 VirusScan Enterprise 提供以下几种新功能,这些功能可以有助于 防止入侵,并更有效地检测入侵: - 产品版本号 新版本为 8.0i。 产品版本号已经从 7.1 更改为 8.0,这一更改反映了自上次发布以来产 品内部功能的重大更改。 有关详细信息,参阅以下"新功能"和"更改 的功能"部分。 产品版本号增加"i"表示 McAfee VirusScan Enterprise 是全球第 一款提供主动式入侵防护系统 (IPS) 保护能力的防病毒产品。这些 IPS 功能是由 McAfee Entercept 的"缓冲区溢出保护"功能提供的, McAfee Entercept 是我们的主机入侵防护安全产品。 - 访问保护。 通过此功能您可以限制对端口、文件、共享资源和文件夹的访问,从而防止 入侵。 通过创建规则指定要阻挡的端口以及是否限制对入站或出站进程的访问,可 以阻挡端口。如果您希望允许一个特定进程或一组进程访问准备阻挡的端口, 也可以从规则排除这些进程。 阻挡端口,即同阻挡 TCP 和 UDP 访问。 您可以通过将共享资源设置为只读或阻止对所有共享资源的读取和写入,限 制对共享资源的访问。 您可以通过创建规则阻挡文件文件夹,规则指定禁止对您定义的文件或文 件夹进行访问的进程、禁止的文件操作以及在某人尝试访问阻挡的项目应 采取的操作。 这些"访问保护"功能在防范入侵非常有效。在病毒发作,管理员可以 阻止对感染病毒区域的访问,直到发布新的 DAT。 注: 如果您阻挡 ePolicy Orchestrator 代理或 Entercept 代理 使用的端口,则代理的进程受到过滤器信任,可以与被阻挡的端口进 行通讯。但是,与这些代理进程无关的通讯将被阻挡。 本版 VirusScan Enterprise 提供了一些端口阻挡规则样本、文件文件夹阻挡规则样本。 默认安装本产品,这些规则有些会处于警告模 式,而有些则处于阻挡模式。 警告: 虽然采用这些规则的目的是防范各种常见的威胁,但是,也会阻挡合 法的活动。在部署 VirusScan Enterprise 之前,我们建议您查 看一下这些规则,确保它们适合于您的网络环境。 需要考虑的事项: - 白名单。每条端口阻挡规则均包括一些排除在阻挡范围之外的应用程 序。这些列表一般包含多数最常见的电子邮件客户端和 web 浏览器。 务必查看每个列表,确保其包含允许发送电子邮件和下载文件 的所有程序。将这些程序列入白名单,确保这些程序不被阻挡。 - 对网络上发生的文件系统活动的阻挡。 某些规则(例如,"禁止远程 创建/修改/删除文件(.exe)")对于阻止自身从一个共享资源复制 到另一个共享资源的病毒非常有效。但是,它们也可能会阻挡那些依 靠将文件推入工作站进行工作的管理系统。例如,在 ePolicy Orchestrator 服务器部署代理,就是将代理安装程序推送到工 作站的管理共享资源上并运行该程序。在部署之前确保为每个规 则选择正确的模式(关闭、警告或阻挡)。 McAfee Installation Designer 可以用于配置 VirusScan 部 署软件包。 警告: 默认规则无法为您的网络环境提供全面的保护。 您所需的限制取决于 您的环境。我们提供的规则的目在于通过示例说明该功能的作用以及 如何利用规则防止某些特定的威胁。 发现新的威胁,病毒信息库将向您提供建议,告诉您如何利用访问 保护规则阻挡这些新威胁。访问以下位置的病毒信息库: http://vil.mcafee.com - 源 IP (按访问扫描)。 按访问扫描程序检测到写入共享文件的病毒,它会在按访问扫描统计信息 对话框和按访问扫描信息对话框显示检测到的病毒的源 IP 地址。 - 阻挡(按访问扫描)。 使用此功能可以阻挡在共享文件夹放置了含有已感染病毒文件的远程计 算机的进一步访问。您可以指定阻挡这些连接的间长短。如果您希望在指 定的间限制之前取消阻挡所有的连接,您可以在按访问扫描统计对话框 进行此操作。 - 缓冲区溢出保护。 "缓冲区溢出保护"可以阻止利用缓冲区溢出在计算机上执行代码。此功能 会检测到从堆栈的数据开始运行的代码,并阻止该代码运行。但是,此功 能不阻止数据写入堆栈。即使"缓冲区溢出保护"功能会阻止受到利用的代 码运行,也不要指望受到利用的应用程序仍然会保持稳定。 VirusScan Enterprise 为大约 30 种最常用且最容易受利用的软件应用程 序及微软 Windows 服务提供缓冲区溢出保护。这些受保护的应用程序在一 个单独的缓冲区溢出保护特征码文件定义。此 DAT 文件在常规更新期间 随病毒特征码文件一起下载。到本产品发布之日为止,缓冲区溢出保护码文 件包括以下应用程序: - dllhost.exe - EventParser.exe - excel.exe - explorer.exe - frameworkservice.exe - ftp.exe - iexplore.exe - inetinfo.exe - lsass.exe - mapisp32.exe - mplayer2.exe - msaccess.exe - msimn.exe - mstask.exe - msmsgs.exe - NaimServ.exe - Naprdmgr.exe - Outlook.exe - powerpnt.exe - rpcss.exe - services.exe - sqlservr.exe - SrvMon.exe - svchost.exe - visio32.exe - VSEBOTest.exe - w3wp.exe - winword.exe - wmplayer.exe - wuauclt.exe 缓冲区溢出保护定义文件更新,此列表也会进行相应的更改。 - 有害程序策略。 使用此功能可以检测到有害程序(例如, Jspyware、adware、dialers、 jokes 等),并对其执行相应的操作。 您可以从当前 -.DAT 文件的预定义列表选择程序所有类别或这些类别 的特定程序。也可以添加自己的程序进行检测。 配置分两步进行: - 首先,在"有害程序策略"配置要检测的程序。默认情况下,此策 略在每个扫描程序属性页是启用的。 - 其次,逐一配置每个扫描程序(按访问扫描程序、按需扫描程序和电 子邮件扫描程序),并指定在检测到有害程序扫描程序要执行的操 作。在此处指定的操作与其他扫描设置无关。 对有害程序的实际检测和随后的清除均由 -.DAT 文件决定,正如对病毒 的处理一样。如果检测到有害程序且主要操作设置为"清除",则 -.DAT 文 件会尝试使用 -.DAT 文件的信息对程序进行清除操作。如果无法清除 检测到的程序,或者不在 -.DAT 文件(例如用户定义的程序),则清 除操作会失败,并转而执行辅助操作。如果您选择"删除"操作,则仅删除 定义为有害的程序,而遭到修改的注册表键可能会保持不变。 - 脚本扫描(按访问扫描)。 使用此功能可以在执行 JavaScript 和 VBScript 脚本之前对其进行 扫描。脚本扫描程序能够象真正的 Windows 脚本主机组件的代理组件一 样运行。它可以阻止脚本(例如 Internet Explorer 网页脚本)的执 行并对其进行扫描。如果脚本不含有病毒,则将其传送给真正的主机。如果 脚本已感染病毒,则不执行脚本。 - Lotus Notes(电子邮件扫描)。 除基于 MAPI 的电子邮件(例如,Microsoft Outlook)之外,电子邮 件传递扫描程序和按需电子邮件扫描程序现在均扫描 Lotus Notes 邮件 和数据库。 您可以配置一系列属性,应用于所安装的任何电子邮件客户端。 客户端扫描程序具有不同的特点,在《产品指南》的"电子邮件扫描"部分 有此方面的介绍。例如,Microsoft Outlook 邮件在传递扫描,而 Lotus Notes 邮件则在访问扫描。 - 选择性更新 (AutoUpdate)。 在 VirusScan 控制台使用 AutoUpdate 任务有选择地仅更新 DAT 文 件、扫描引擎、产品升级、HotFix、补丁程序或 Service Pack 等。 如果您通过 ePolicy Orchestrator 管理 VirusScan Enterprise, 则只有 ePolicy Orchestrator 3.5 或更高版本才提供此选择性更新 功能。早期版本的 ePolicy Orchestrator 不支持此功能。 - Alert Manager 本地警报。 无需本地安装 Alert Manager 服务器,即可生成 SNMP 陷阱和本地事 件日志条目。 - 修复安装。 通过 VirusScan 控制台"帮助"菜单的新菜单项,您可以修复安装。 您可以选择将产品恢复为原始安装设置,或重新安装程序文件。 用户必须具有管理权限才能执行这些功能。 管理员可以对此功能进行保护, 即在"用户界面选项"的"密码选项"对话框为其设置密码。 警告: 将产品恢复为原始安装设置,自定义的设置会丢失。 重新安装程序文件,将覆盖 HotFix、补丁程序和 Service Pack。 - 错误报告服务。 错误报告服务启用后,可以提供对 Network Associates 应用程序的持 续后台监控功能,并在检测到问题提示用户。检测到错误,用户可以选 择提交数据进行分析或忽略该错误。在 VirusScan 控制台的"工具" 启用"错误报告服务"。 ______________________________________________________________________ 更改的功能 自上次发布 VirusScan Enterprise 以来,以下功能已发生更改: - 每天更新 (AutoUpdate)。 默认 AutoUpdate 任务间安排已经从每周更改为每天。当然,管理员 可以修改该间安排。 - 默认下载站点 (AutoUpdate)。 执行 AutoUpdate ,现在默认的下载站点为 HTTP 站点,FTP 站点 作为辅助站点。 有关详细说明,参阅《VirusScan Enterprise 产 品指南》。 - 系统使用率(按需扫描)。 CPU 使用率已更改为系统使用率。 按需扫描启动后,该功能会采集最初 30 秒钟内的 CPU 和 IO 样本,然后根据您在按需扫描属性指定的使用率 水平进行扫描。这样更为符合实际需要,我们可以根据 CPU 和 IO 的使 用率平衡利用 CPU 和磁盘资源。 - 可恢复的扫描。 经过更改后,按需扫描程序可以执行真正的可恢复扫描。如果在完成扫描之 前断扫描,则扫描程序会从扫描断处自动恢复扫描。扫描程序的增量扫 描功能能够识别上一次扫描的文件,因此下次扫描启动,可以从断处恢 复扫描。 - 压缩文件扫描。 本版本从扫描选项删除了"扫描压缩的文件"选项,因为该功能已经在每 种扫描程序永久性启用了。扫描程序始终会扫描压缩文件。 ______________________________________________________________________ 安装和系统要求 有关安装和系统要求的完整信息,参阅产品文档。 测试安装 您可以通过在已经安装本软件的任何计算机上运行 EICAR 标准防病毒测试文件, 测试软件的运行情况。EICAR 标准防病毒测试文件是全世界防病毒产品厂商 共同努力的成果,它使客户可以按照一个统一标准验证其安装的防病毒产品。 要测试安装,: 1. 将下面一行文字复制到一个独立文件,然后以 EICAR.COM 名称保存文件。 X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 该文件的大小为 68 或 70 字节。 2. 启动防病毒软件,让它扫描 EICAR.COM 所在的目录。 VirusScan Enterprise 扫描此文件,它会报告发现 EICAR 测试文 件。 3. 测试完安装的软件后,删除文件,以避免对正常用户发出警告。 重要信息: 注意,此文件并非病毒。 _____________________________________________________________________ 已解决问题 下面介绍本软件产品以前版本存在但当前版本解决问题。 1. 问题: VirusScan Enterprise 7.1 按访问扫描程序会对其他 McAfee防病 毒或安全产品的隔离文件夹包含的数据执行操作,除非从扫描任务排 除那些文件夹。例如,如果您在已经安装 VirusScan Enterprise 的 同一台计算机上使用 McAfee GroupShield 或 IntruShield,则它 们各自的隔离文件夹可能会包含合法的感染病毒的数据。这些隔离文件夹 应该从按访问扫描任务排除,以避免清除、删除或移动合法的感染病毒的 数据。 解决方案: 安装程序会检测到其他产品并为其添加排除项。 2. 问题: 对于使用 ePolicy Orchestrator 3.0 创建和部署的按需扫描任务, 可恢复扫描不起作用。 如果在 ePolicy Orchestrator 创建的按需 扫描在扫描完成之前即结束(由于系统关闭等),就会出现这种问题。按需 扫描任务再次启动,它会再次从开始位置扫描,而不是从最后扫描的文件 恢复扫描。 解决方案: 对于使用 ePolicy Orchestrator 3.0 创建和部署的按需扫描任务, 可恢复扫描工作正常。 3. 问题: 具有用户权限(相对于具有管理员权限的管理员)的用户回滚 DAT 文件出现下列错误: "无法保存刚刚回滚的 DAT 版本" 这意味着 VirusScan Enterprise 无法创建正确的注册表键,以识别 回滚操作。因此,执行更新可能会重新应用回滚的 DAT。在回滚的 DAT 版 本已损坏(这通常是执行 DAT 回滚的原因)的情况下,这会产生问题。 正常情况下,VirusScan Enterprise 不更新经过回滚的 DAT 版本。 注: 只有在除管理员之外的其他人员执行 DAT 回滚出现问题。在 管理员执行回滚,不能通过更新应用回滚的 DAT 版本。 解决方案: 无法重新应用回滚的 DAT。 4. 问题: 通过 ePolicy Orchestrator 部署 VirusScan Enterprise , 或采用静默安装,VShield 图标不出现在系统任务栏解决方案: 现在,通过 ePolicy Orchestrator 部署 VirusScan Enterprise ,或静默安装,VShield 图标会显示在系统任务栏。 5. 问题: 将 VirusScan Enterprise 安装至采用 Intel 64 位处理器的系统 ,不能使用 REGSVR32.EXE 正确注册 VSUPDATE.DLL 文件。结果, 在安装完成后执行更新操作,会出现错误,并会显示以下错误信息: "加载 COM 组件出错。" 要正确注册.DLL,在命令提示符下输入以下命令: "<驱动器>:\Winnt\syswow64\regsvr32.exe <installation path>vsupdate.dll" 注: 如果您将 VirusScan Enterprise 安装到默认位置,则安装路径 为: <驱动器>:\Program Files\Network Associates\VirusScan\ 解决方案: 此问题在 VirusScan Enterprise 8.0 已经得到解决。 ______________________________________________________________________ 已知问题 安装、升级和卸载 1. 在安装结束,需要重新启动系统(具有可选性),才能加载 TDI 网络驱 动程序。在重新启动计算机之前,"端口阻挡"、"病毒感染跟踪"和"病 毒感染跟踪阻挡"功能均处于禁用状态。 2. Internet Explorer 要求。《VirusScan Enterprise 8.0 安装指 南》将 Internet Explorer 要求错误列为 5.0 版或更高版本。 Internet Explorer 要求是 Internet Explorer 4.0 版 Service Pack 2 或更高版本。 3. 如果您准备在采用 Windows NT4 操作系统的计算机上安装 VirusScan Enterprise 8.0,并使用 AutoUpdate 功能,则必须首先在该计算机 上安装 Internet Explorer 4.0 Service Pack 2 或更高版本。 如果在您开始在采用 Windows NT4 操作系统的计算机上安装 VirusScan Enterprise 8.0 之前没有安装 Internet Explorer 4.0 Service Pack 2 或更高版本,系统会生成一个错误编号 1920"服务器启动失败" 的错误,要求您选择"放弃"、"重试"或"继续"安装。如果"继续" 安装,则不会安装 AutoUpdate 组件。如果您决定以后安装 AutoUpdate 功能,则必须首先安装 Internet Explorer 4.0 Service Pack 2 或 更高版本,然后,完全删除 VirusScan Enterprise 8.0 并重新安装。 4. 如果您使用未压缩的安装程序"SETUPVSE.EXE"在 Windows NT4 终端服务 器上安装 VirusScan Enterprise,则必须在执行"SETUPVSE.EXE"之前, 先将终端服务器切换到"安装模式"。有关详细信息,参阅知识库的文 章 KB37558。 5. 要使用 MSIEXEC.EXE 安装 VirusScan Enterprise 产品,完成以 下步骤: a. 在命令提示符下输入以下命令,解压缩 .MSI 和其他文件: SETUP.EXE -nos_ne [-nos_o"<output path>"] 注: -nos_ne 命令会从 SETUP.EXE 解压缩安装文件,但是不会 执行 SETUP.EXE 或删除安装文件。 -nos_o"<output path>" 命令会指定用于解压缩安装文件的 目标文件夹。 如果不指定输出路径,这些文件会解压缩到用户配置文件的" Temp"文件夹内。 b. 确保删除任何其他厂商的产品,包括 McAfee VirusScan 和 VirusScan Enterprise 早期版本。 c. 在命令提示符下输入以下命令,运行 MSIEXEC.EXE: "msiexec.exe /i vse800.msi" 6. 安装"缓冲区溢出保护"功能,会有以下限制: - 如果在已经安装 McAfee Entercept 代理的计算机上安装 "缓冲区溢出保护",则会在 VirusScan 控制台禁用"缓 冲区溢出保护"功能。 McAfee Entercept 产品覆盖范围更大,因此 McAfee Entercept 产品优先于 VirusScan Enterprise 的"缓冲区溢出保护"功 能。 - 在 64 位平台上无法安装"缓冲区溢出保护"。 - 缓冲区溢出保护与 Windows XP 快速用户切换配合使用,仅 保护会话。 - 缓冲区溢出保护并不保护 Windows 终端服务器或 Citrix MetaFrame 的终端会话。 它仅保护本地登录。 7. 在 64 位平台上无法安装 ScriptScan。 8. 在 64 位平台上无法安装右键单击扫描功能。 9. 本版本支持使用管理安装点 (AIP) 进行部署。但是,必须从 AIP 运行 SETUP.EXE,才能执行升级或卸载其他防病毒软件。 要创建 AIP,在命令提示符下输入"setup.exe /a"。此出现一 个向导,指导您创建 AIP。创建 AIP 后,压缩 (.ZIP) 文件的所有 必要文件均同复制到 AIP。这些文件包括: - CMU300.NAP - CONTACT.TXT - EXAMPLE.SMS - EXTRA.DAT - INSTALL.PKG - INSTMSIW.EXE - PKGCATALOG.Z - PACKING.LST - README.TXT - SETUP.INI - SETUPVSE.EXE - SIGNLIC.TXT - UNINST.DLL - UNINST.INI - VSE800.NAP - VSE800DET.MCS 由于这些文件会自动复制到 AIP,因此,管理员不需要手动复制这些文件。 注: 如果通过 Active Directory 组策略部署 VirusScan Enterprise(这样会使用 MSIEXEC.EXE 进行安装),则必须首 先删除现有的所有防病毒产品,才能安装 VirusScan Enterprise。 10. 静默完全安装 Computer Associates eTrust Antivirus 程序, 该操作不完全静默进行。Computer Associates eTrust Antivirus 会显示一个包含"确定"按钮消息框,提示需要重新启动。单击"确定" 后,完全安装会继续正常进行。此问题是 Computer Associates 的 一个已知问题,您可以访问 Computer Associates 的网站,编号为 QO19636 的文章即介绍相关的内容。Computer Associates 网站提 供修补此问题的可下载文件。虽然此问题针对 Computer Associates eTrust Antivirus 6.0 版,但是,该补丁程序对 7.0 版也适用。 与其他产品的兼容性 Alert Manager 1. VirusScan Enterprise 8.0 只能向 Alert Manager 4.7.x 发送 警报。无法向早期版本的 Alert Manager 发送警报。 此外,在已经安装 Alert Manager4.7.x 以前版本的计算机上,无法安 装 VirusScan Enterprise 8.0。如果您在已经安装 Alert Manager 4.5 或 4.6 的系统安装 VirusScan Enterprise 8.0,应该同 安装 Alert Manager 4.7.x,该版本会自动替换早期版本。 但是,注意,Alert Manager 4.7.x 可以接收早期版本的 NetShield 和 VirusScan 发送的警报。您可以配置这些软件程序的早 期版本将警报发送到 Alert Manager 4.7.x。 2. 在 Windows 2003 (.NET) Server 上安装 Alert Manager ,警 报消息不会自动在 VirusScan Enterprise 8.0 显示。 您必须手 动启动信息服务: a. 从"开始"菜单,依次选择 "设置"|"控制面板"|"管理工具"|"服务"|"Messenger" b. 打开"Messenger 的属性"对话框。 c. 在常规选项卡的"启动类型"下,选择"自动"。 d. 在"常规"选项卡的"服务状态"下,单击"启动"。 e. 单击"确定"应用这些更改,并关闭"Messenger 的属性"对话框。 Common Management Agent 1. 在 ePolicy Orchestrator 3.0.x 安装 VirusScan Enterprise 8.0 不会将 Common Management Agent 自动从早期版本自动升级到 3.5 版。如果您使用 ePolicy Orchestrator 3.0.x 和 VirusScan Enterprise 7.x,则在将 VirusScan Enterprise 8.0 安装软件包 添加至 ePolicy Orchestrator 资料库,Common Management Agent 不会升级至 3.5 版。 要将 Common Management Agent 从早期版本升级到 3.5 版,必须安 装 Common Management Agent 3.5 版,然后,将其推送到客户端或 执行更新任务。 注: 使用 ePolicy Orchestrator 管理 VirusScan Enterprise 8.0 ,不需要安装 Common Management Agent 3.5。Common Management Agent 3.5 版与其早期版本仅有的不同之处在于: - Common Management Agent 3.5 版能够进行选择性更新,而 早期版本只能进行整体更新。选择性更新允许您单独更-.DAT、 扫描引擎和补丁程序等。 - Common Management Agent 3.5 版不过滤客户端的事件。 2. 如果已经安装 Common Management Agent 3.5 版,则安装 ePolicy Orchestrator 3.0.x 会失败。 如果您尝试在已经安装 VirusScan 8.0 的同一台计算机上安装 ePolicy Orchestrator 3.0.x,则 ePolicy Orchestrator 安装会因为 Common Management Agent 的 升级问题而失败。因为 VirusScan Enterprise 8.0 安装 Common Management Agent 3.5 版,而 ePolicy Orchestrator 3.0.x 安 装早期版本的 Common Management Agent,所以代理程序无法升级, 安装自然会失败。 要解决问题执行以下步骤: a. 删除 VirusScan Enterprise 8.0。 a. 安装 ePolicy Orchestrator 3.0.x。 b. 重新安装 VirusScan Enterprise 8.0。 c. 要在 ePolicy Orchestrator 3.0.x 将 Common Management Agent 从早期版本升级到 3.5 版,必须在 ePolicy Orchestrator 3.0.x 安装 Common Management Agent 3.5 版,然后将其推送到客户端或执行更新任务。 ePolicy Orchestrator 1. 如果您准备使用 ePolicy Orchestrator 管理 VirusScan Enterprise 8.0,则必须使用 ePolicy Orchestrator 3.0 版 Service Pack 1 或更高版本。 2. 选择性更新。要使用新的选择性更新功能,必须使用 ePolicy Orchestrator 3.5 或更高版本管理 VirusScan Enterprise.早期 版本的 ePolicy Orchestrator 会执行更新,但是不支持仅更新 .DAT 文件、扫描引擎等的选择性更新。 3. 本版 VirusScan Enterprise 8.0 提供两个 .NAP 文件,必须将这 两个.NAP 文件添加到 ePolicy Orchestrator 资料库内。另外,如 果您运行 ePolicy Orchestrator 3.0.x,在添加两个 .NAP 文件后, 必须运行更新可执行文件,以解决与事件解析程序注册有关的问题。 注: 如果您运行 ePolicy Orchestrator 3.5 版或更高版本,则不需 要运行更新可执行文件。 这些文件随 VirusScan Enterprise 8.0 安装软件包附带,您可以从 下载这些文件的位置找到这些文件: - VSE800.NAP - VSE800REPORTS.NAP.此文件一个扩展报告.NAP 文件。 - VSE800UPDATEFOREPO30.EXE. 此文件一个更新可执行文件。 a. 将两个 .NAP 文件添加至 ePolicy Orchestrator 资料库。 注: 我们建议您在安装 VSE800.NAP 之前,先安装 VSE800REPORTS.NAP 文件。按照此顺序安装 .NAP 文件可 以防止在托管产品下显示的 VirusScan Enterprise 英文说 明出现问题。有关详细信息,参阅本部分的已知问题 8。 b. 如果您使用 ePolicy Orchestrator 3.0.x,则可以在已经安装 ePolicy Orchestrator 3.x 的计算机上执行 VSE800UPDATEFOREPO30.EXE。 此可执行文件用于在 ePolicy Orchestrator 3.0.x 服务器上 注册事件解析程序 .DLL。此更新解决了 ePolicy Orchestrator 的一个问题,这一问题会导致在添加扩展报告 .NAP 事件解析程序 错误注册。 注: 有关详细信息,参阅《与 ePolicy Orchestrator 配合使用的 VirusScan Enterprise 8.0 配置指南》。 4. 如果将 VSEREPORTS.NAP 文件登记到 ePolicy Orchestrator 3.01 版或 3.02 版资料库,可能会导致"未指定的错误"。 这是一个控制台超错误,可以忽略。即使控制台超,服务器仍会完成 .NAP 文件所有的 SQL 脚本的执行。 5. 如果您将 Microsoft SQL Server 7.0 版与 ePolicy Orchestrator 3.01 或更高版本配合使用,则在将 VSE800.NAP 文件登记到 ePolicy Orchestrator 资料库,按需扫描任务不会保留。 必须安装 Microsoft SQL Server 2000 版或更高版本,才能保留按需扫描任务。 6. 从 ePolicy Orchestrator 服务器通过 UNC 将资料库复制到某服务 器,且该服务器已经在"访问保护属性"启用这些文件阻挡规则,复制 的资料库可能会损坏: - "禁止远程修改文件 (.exe)" - "禁止远程修改文件 (.dll)" - "禁止远程创建/修改/删除系统根目录的任何内容" - "禁止远程创建/修改/删除文件 (.exe)" 这些规则启用,某些文件复制会被阻止,因为 ePolicy Orchestrator 服务器远程打开文件,并采用与共享传播式蠕虫同样的方 式进行写入访问和修改其内容。 如果您准备从 ePolicy Orchestrator 服务器通过 UNC 复制资料库, 确保在目标服务器上禁用这些文件阻挡规则,然后再执行复制任务。 7. 从资料库删除项目,ePolicy Orchestrator 符合性基线不会重新 评估符合性。 例如,在将 VirusScan Enterprise 8.0 登记到 ePolicy Orchestrator 资料库,它会标记为该环境的新符合性基线。所有已经 安装 VirusScan Enterprise 8.0 以前版本的计算机均标记为不符合。 不过,如果您从资料库删除 VirusScan Enterprise 8.0,而不是重 新评估符合性,则符合性基线会保持在 8.0 版。即使将 VirusScan Enterprise 7.1 重新登记到资料库,符合性基线只会增量提高。 8. 取决于安装两个 VirusScan Enterprise 8.0 .NAP 文件的顺序, 在 ePolicy Orchestrator"Repository "(资料库)"Managed Products"(托管产品)|"Windows"|"VirusScan Enterprise"|"8.0.0" 下的 VirusScan Enterprise 8.0 的英文说明可能不可 用。 如果在安装 VSE800REPORTS.NAP 之前已经将 VSE800.NAP 安装 到资料库,则英文说明不可用。 如果在安装 VSE800.NAP 之前已经安装 VSE800REPORTS.NAP, 则英文说明可用。 9. 在 ePolicy Orchestrator"Event Filtering"(事件过滤)策略 禁用事件过滤。VirusScan Enterprise 会生成许多事件 ID,这些 ID 不会在 ePolicy Orchestrator 过滤器列表列出。 要确保发送 所有 VirusScan Enterprise 事件,在策略禁用事件过滤功能: a. 登录至 ePolicy Orchestrator 控制台。 b. 在"Reporting"下,选择"ePO 数据库"并将其展开。 c. 选择服务器并登录。 d. 选择"事件"。 e. 在右侧窗格,选择"不过滤事件"。 f. 单击"应用"保存这些设置。 GroupShield 1. 除 VirusScan Enterprise 8.0 和 Alert Manager 4.7.1 之外, 如果您准备使用 GroupShield,确保在安装 Alert Manager 之 前安装 GroupShield。必须按照此顺序安装,才能确保警报发送正常。 ProtectionPilot 1. 如果您准备使用 Protection Pilot 管理 VirusScan Enterprise 8.0i,则必须使用 Protection Pilot 1.0 版 Patch 1 或更高版本。 2. 如果将 VSEREPORTS.NAP 文件登记到 ProtectionPilot 资料库,可 能会导致"未指定的错误"。 这是一个控制台超错误,可以忽略。即使控制台超,服务器仍会完成 .NAP 文件所有的 SQL 脚本的执行。 3. 在 ProtectionPilot 上无法使用选择性更新。此功能仅在 ePolicy Orchestrator 3.5 或更高版本提供。 第三方软件 1. Spy Sweeper。如果您使用 Spy Sweeper 扫描 VirusScan Enterprise 安装文件夹,则在它检测到 BHO.DLL 会发生检测错误。 此文件并不是 spyware;它是随 VirusScan Enterprise 安装的 ScriptScan 的一个组件。 2. Microsoft Windows XP Service Pack 2。如果您使用 Microsoft Windows XP Service Pack 2 并准备通过 ePolicy Orchestrator 管理 VirusScan Enterprise,则 Windows XP Firewall 将禁止这种操作,除非将 FRAMEWORKSERVICE.EXE 添加到 Windows XP Firewall 的排除白名单。有 关如何进行此操作的信息,参阅 Microsoft 知识库的文章 842242。 3. 以下第三方产品与 VirusScan Enterprise 8.0 的"缓冲区溢出"功能不兼 容。如果必须使用这些产品,我们建议您禁用 VirusScan Enterprise"缓 冲区溢出"功能: - Tiny Personal Firewall - CyberArmour Firewall - Zone Alarm Pro 注: VirusScan Enterprise 8.0 和 Zone Alarm Pro 安装在同一 台计算机上,Zone Alarm Pro 会崩溃。 - BlackIce Firewall 注: 先安装 VirusScan Enterprise 8.0,然后再安装 BlackIce Firewall,以确保它们兼容。 访问保护 1. 与已知漏洞和弱点相关的端口。使用此链接可以访问一个网站,该站点提供 最经常受利用的 TCP 端口的列表。 http://www.us-cert.gov/current/services_ports.html 注: 如果通过单击无法访问链接,将其复制粘贴至 web 浏览器,即可 访问该站点。 2. 如果您禁用按访问扫描程序,则同会禁用端口阻挡规则和您配置的文件、 共享资源以及文件夹规则。 3. 如果您在非英语或本地化环境使用"访问保护"功能,则默认规则可能会 包含本地化操作系统不存在的文件夹的参考。 添加文件类型扩展名 1. 如要您在"其他文件类型"或"指定文件类型"对话框使用通配符指定文 件类型扩展名,则不能使用 (*) 作为通配符。在这些情况下指定文件类型 扩展名,必须使用问号 (?) 作为通配符。 AUTOUPDATE 1. 只有在更新登录且对该映射驱动器位置至少具有读取权限,才能从映射 驱动器进行更新。如果没有用户登录到该系统,或者,虽然登录但是对映射 位置不具有最起码的读取权限,则更新将失败。 2. 编辑资料库列表使用 UNC 路径,"编辑 AutoUpdate 资料库列表" 对话框不会在接受所输入的路径之前验证其事实上是否为有效的 UNC 共享 资源。 确保输入有效的 UNC 服务器、共享资源和路径名称。输入无效的 UNC 路径可能会导致从此位置进行更新出现问题。 3. VirusScan Enterprise《产品指南》的 EXTRA.DAT 信息。这些信息用于 对 VirusScan Enterprise《产品指南》"更新"部分的信息进行更正。 "更新任务执行过程的活动"下的"更新"部分错误地叙述如下: "默认情况下,将新病毒特征
一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程按默认设置即可。 2.运行Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示 程序。 3.我们用File->New 菜单来新建工程。 4.这里我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这里的工程名为helloworld。 6.这软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程的所有文件出现在列表了。我们可以直接按下下面的 绿色的run 按钮或者按下Ctrl+R 快捷键运行程序。 10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的dialog.ui 文件,便出现了下面所示的图形界面编辑界 面。 12.我们在右边的器件栏里找到Label 标签器件 13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为helloworld。 15.我们在右下角的属性栏里将字体大小由9 改为15。 16.我们拖动标签一角的蓝点,将全部文字显示出来。 17.再次按下运行按钮,便会出现helloworld。 到这里helloworld 程序便完成了。 Qt Creator 编译的程序,在其工程文件夹下会有一个debug 文件夹,其程序的.exe 可执行文件。但Qt Creator 默认是用动态链接的, 就是可执行程序在运行需要相应的.dll 文件。我们点击生成的.exe 文件,首 先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装 应用程序可能会修复此问题。”表示缺少mingwm10.dll 文件解决这个问题我们可以将相应的.dll 文件放到系统 。在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘, 所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这里 找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,即可。下 面再提示缺少什么dll 文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直 接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后, 我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立一个对 话框类,将其加入工程,然后在程序调用自己新建的对话框类来实现多窗口。 实现过程: 1.首先新建Qt4 Gui Application 工程,工程名为nGui,Base class 选为QWidget。 建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这里已经默认将其加入到了我们刚建的工程了。 6.如下图,在mydlg.ui 拖入一个Push Button,将其上的文本改为“进入主 窗口”,在其属性窗口将其objectName 改为enterBtn,在下面的Signals and slots editor 进行信号和槽的关联,其,Sender 设为enterBtn,Signal 设为clicked(),Receive 设为myDlg,Slot 设为accept()。这样就实现了单击 这个按钮使这个对话框关闭并发出Accepted 信号的功能。下面我们将利用这个 信号。 7.修改主函数main.cpp,如下: #include <QtGui/QApplication> #include "widget.h" #include "mydlg.h" //加入头文件 int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; myDlg my1; //建立自己新建的类的对象my1 if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则不会进入主窗口,整个程 序结束运行 } 主函数必须这么写,才能完成所要的功能。 如果主函数写成下面这样: #include <QtGui/QApplication> #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; if(my1.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 这样,因为w 是在if 语句里定义的,所以当if 语句执行完后它就无效了。这样 导致的后果就是,按下enterBtn 后,主界面窗口一闪就没了。如果此程序 改动了,再次点击运行,就会出现error: collect2: ld returned 1 exit status 的错误。这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有 结束,而是在后台运行。所以这改动程序,再运行便会出错。你可以按下调 试栏上面的红色Stop 停止按钮来停止程序运行。你也可以在windows 任务管理 器的进程将该进程结束,而后再次运行就没问题了,当然先关闭Qt Creator, 而后再重新打开,这样也能解决问题。 如果把程序改为这样: #include <QtGui/QApplication> #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; Widget w; if(my1.exec()==QDialog::Accepted) { w.show(); } return a.exec(); } 这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1 对话框出现 候不点enterBtn,而是直接关闭对话框,那么此整个程序应该结束执行,但 是事实是这样的吗?如果你此程序进行了改动,再次按下run 按钮,你会发 现又出现了error: collect2: ld returned 1 exit status 的错误,这说明程 序并没有结束,我们可以打开windows 任务管理器,可以看到我们的程序仍在执 行。 因为return a.exec();一句表示只要主窗口界面不退出,那么程 序就会一直执行。所以只有用第一种方法,将该语句也放到if 语句,而在else 语句用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序。下面我们在主窗口上加一个按钮,按下该按钮,弹出一个对话框, 但这个对话框关闭,不会使主窗口关闭。 8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠 标右键,在弹出的菜单选择go to slot。 9.我们选择单击事件clicked()。 10.我们在弹出的槽函数添加一句: my2.show(); my2 为我们新建对话框类的另一个对象,但是my2 我们还没有定义,所以 在widget.h 文件添加相应代码,如下,先加入头文件,再加入my2 的定义语 句,这里我们将其放到private 里,因为一般的函数都放在public 里,而变量 都放在private 里。 #ifndef WIDGET_H #define WIDGET_H #include <QtGui/QWidget> #include "mydlg.h" //包含头文件 namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; myDlg my2; //对my2 进行定义 private slots: void on_pushButton_clicked(); }; #endif // WIDGET_H 到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我们用两 种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器实现其关 联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是 一样的。 这个程序里我们实现了两类窗口打开的方式,一个是自身消失而 后打开一个窗口,一个打开一个窗口而自身不消失。可以看到他们实现的 方法是不同的。 三、Qt Creator 登录对话框(原创) 实现功能: 在弹出对话框填写用户名和密码,按下登录按钮,如果用户名和密码均正确则 进入主窗口,如果有错则弹出警告对话框。 实现原理: 通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用 if 语句进行判断。 实现过程: 1.先新建Qt4 Gui Application 工程,工程名为mainWidget,选用QWidget 作 为Base class,这样便建立了主窗口。文件列表如下: 2.然后新建一个Qt Designer Form Class 类,类名为loginDlg,选用Dialog without Buttons,将其加入上面的工程文件列表如下: 3.在logindlg.ui 设计下面的界面:行输入框为Line Edit。其用户名后面 的输入框在属性设置其object Name 为usrLineEdit,密码后面的输入框为 pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。 4.将exitBtn 的单击后效果设为退出程序,关联如下: 5.右击登录按钮选择go to slot,再选择clicked(),然后进入其单击事件的槽 函数,写入一句 void loginDlg::on_loginBtn_clicked() { accept(); } 6.改写main.cpp: #include <QtGui/QApplication> #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; loginDlg login; if(login.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; } 7.这执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text()==tr("qt")&&m_ui->pwdLineEdit->text()==tr ("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 } } 并在logindlg.cpp 加入#include <QtGui>的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告对话框。 如果输入错误,便会弹出警告提示框: 10.在logindlg.cpp 的loginDlg 类构造函数里,添上初始化语句,使密码显示 为小黑点。 loginDlg::loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui::loginDlg) { m_ui->setupUi(this); m_ui->pwdLineEdit->setEchoMode(QLineEdit::Password); } 效果如下: 11.如果输入如下图的用户名,在用户名前不小心加上了一些空格,结果程序 按错误的用户名对待了。 我们可以更改if 判断语句,使这样的输入也算正确。 void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); } } 加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框,我们希望可以使用户名和 密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽 函数如下: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 m_ui->usrLineEdit->clear();//清空用户名输入框 m_ui->pwdLineEdit->clear();//清空密码输入框 m_ui->usrLineEdit->setFocus();//将光标转到用户名输入框 } } 四、Qt Creator 添加菜单图标(原创) 在下面的几节,我们讲述Qt 的MainWindow 主窗口部件。这一节只讲述怎样在其 上的菜单栏里添加菜单和图标。 1.新建Qt4 Gui Application 工程,将工程命名为MainWindow,其他选项默认 即可。 生成的窗口界面如下图。其最上面的为菜单栏。 2.我们在Type Here 那里双击,并输入“文件(&F)”,这样便可将其文件菜单的 快捷键设为Alt+F。(注意括号最好用英文半角输入,这样看着美观) 3.输入完按下Enter 键确认即可,然后在子菜单加入“新建(&N)”,确定后, 效果如下图。 4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。 5.双击这一条,可打开它的编辑对话框。我们看到Icon 项,这里可以更改“新 建”菜单的图标。 6.我们点击后面的...号,进入资源选择器,但现在这里面是空的。所以下面我 们需要给该工程添加外部资源。 7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图 标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file, 将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加的文件为menu.qrc。 9.我们最好先在工程文件夹里新建一个文件夹,如images,然后将需要的图标 文件放到其。 10.在Qt Creator 的menu.qrc 文件,我们点击Add 下拉框,选择Add Prefix。 我们可以将生成的/new/prefix 前缀改为其他名字,如/File。 11.然后再选择Add 下拉框,选择Add Files。再弹出的对话框,我们到新建 的images 文件夹下,将里面的图标文件全部添加过来。 12.添加完成后,我们在Qt Creator 的File 菜单里选择Save All 选项,保存所 做的更改。 13.这打开资源选择器,可以看到我们的图标都在这里了。(注意:如果不显 示,可以按一下上面的Reload 按钮) 14.我们将new.png 作为“新建”菜单的图标,然后点击Shortcut,并按下 Crtl+N,便能将Crtl+N 作为“新建”菜单的快捷键。 15.这打开文件菜单,可以看到“新建”菜单已经有图标了。 运行程序后效果如下。 16.我们在工程文件夹下查看建立的menu.qrc 文件,可以用写字板将它打开。 其具体内容如下。 附:第二种添加资源文件的方法。 1.首先右击工程文件夹,在弹出的菜单选择Add New,添加新文件。也可以用 File 的添加新文件。 2.我们选择文本文件。 3.将文件名设置为menu.qrc。 4.添加好文件后将其内容修改如下。可以看到就是用第一种方法生成的 menu.qrc 文件的内容。 5.保存文件后,在资源管理器可以看到添加的图标文件。 五、Qt Creator 布局管理器的使用(原创) 上篇讲解了如何在Qt Creator 添加资源文件,并且为菜单添加了图标。这次 我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。 首先对菜单进行完善。 1.我们在上一次的基础上再加入一些常用菜单。 “文件”的子菜单如下图。间的分割线可以点击Add Separator 添加。 “编辑”子菜单的内容如下。 “帮助”子菜单的内容如下。 2.我们在动作编辑器对各个菜单的属性进行设置。 如下图。 3.我们拖动“新建”菜单的图标,将其放到工具栏里。 拖动“新建”菜单的图标。 将其放到菜单栏下面的工具栏里。 4.我们再添加其他几个图标。使用Append Separator 可以添加分割线。 5.最终效果如下。如果需要删除图标,可以在图标上点击右键选择Remove action 即可。 下面简述一下布局管理器。 (这里主要以垂直布局管理器进行讲解,其他类型管理器用法与之相同,其效 果可自己验证。) 1.在左边的器件栏里拖入三个PushButton 和一个Vertical Layout(垂直布局 管理器)到心面板。如下图。 2.将这三个按钮放入垂直布局管理器,效果如下。可以看到按钮垂直方向排列, 并且宽度可以改变,但高度没有改变。 3.我们将布局管理器整体选,按下上面工具栏的Break Layout 按钮,便可取 消布局管理器。(我们当然也可以先将按钮移出,再按下Delete 键将布局管理 器删除。) 4.下面我们改用分裂器部件(QSplitter)。 先将三个按钮同,再按下上面工具栏的Lay Out Vertically in Splitter (垂直分裂器)。 效果如下图。可以看到按钮的大小可以随之改动。这也就是分裂器和布局管理器 的分别。 5.其实布局管理器不但能控制器件的布局,还有个很重要的用途是,它能使器件 的大小随着窗口大小的改变而改变。 我们先在主窗口的心拖入一个文本编辑器Text Edit。 这直接运行程序,效果如下。可以看到它的大小和位置不会随着窗口改变。 下面我们选主窗口部件,然后在空白处点击鼠标右键,选择Layout->Lay Out in a Grid,使整个主窗口的心区处于网格布局管理器。 可以看到,这文本编辑器已经占据了整个主窗口的心区。 运行一下程序,可以看到无论怎样拉伸窗口,文本编辑框的大小都会随之改变。 我们在这里一共讲述了三种使用布局管理器的方法,一种是去器件栏添加,一 种是用工具栏的快捷图标,还有一种是使用鼠标右键的选项。 程序用到的图标是我从Ubuntu 复制的,可以到 http://www.qtcn.org/bbs/read.php?tid=23252&page=1&toread=1 下载到。 六、Qt Creator 实现文本编辑(原创) 前面已经将界面做好了,这里我们为其添加代码,实现文本编辑的功能。 首先实现新建文件文件保存,和文件另存为的功能。 (我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大的程序 ,经常对源文件进行备份,是个很好的习惯。) 在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记事本一 样的软件,所以最好先打开windows 的记事本,进行一些简单的操作,然后 考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上 去的,不要设想一下子写出所有的功能。我们这里先实现新建文件保存文件, 和文件另存为三个功能,是因为它们联系很紧,而且这三个功能总的代码量也 不是很大。 因为三个功能之间的关系并不复杂,所以我们这里便不再画流程图,而只是简 单描述一下。 新建文件,那么如果有正在编辑的文件,是否需要保存呢? 如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该先将其 另存为。 下面开始按这些关系写程序。 1.打开Qt Creator,在File 菜单选择Open,然后在工程文件夹打开 MainWindow.pro 工程文件。 先在main.cpp 文件加入以下语句,让程序可以使用文。 在其加入#include <QTextCodec> 头文件包含,再在主函数加入下面一行: QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 这样在程序使用文,便能在运行显示出来了。更改后文件如下图。 2.在mainwindow.h 文件的private 下加入以下语句。 bool isSaved; //为true 标志文件已经保存,为false 标志文件尚未保存 QString curFile; //保存当前文件文件名 void do_file_New(); //新建文件 void do_file_SaveOrNot(); //修改过的文件是否保存 void do_file_Save(); //保存文件 void do_file_SaveAs(); //文件另存为 bool saveFile(const QString& fileName); //存储文件 这些是变量和函数的声明。其isSaved 变量起到标志的作用,用它来标志文件 是否被保存过。然后我们再在相应的源文件里进行这些函数的定义。 3.在mainwindow.cpp 先加入头文件#include <QtGui>,然后在构造函数里添 加以下几行代码。 isSaved = false; //初始化文件为未保存过状态 curFile = tr("未命名.txt"); //初始化文件名为“未命名.txt” setWindowTitle(curFile); //初始化主窗口的标题 这是对主窗口进行初始化。效果如下。 4.然后添加“新建”操作的函数定义。 void MainWindow::do_file_New() //实现新建文件的功能 { do_file_SaveOrNot(); isSaved = false; curFile = tr("未命名.txt"); setWindowTitle(curFile); ui->textEdit->clear(); //清空文本编辑器 ui->textEdit->setVisible(true); //文本编辑器可见 } 新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标志为未 保存过状态。 5.再添加do_file_SaveOrNot 函数的定义。 void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框 { if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保 存对话框 { QMessageBox box; box.setWindowTitle(tr("警告")); box.setIcon(QMessageBox::Warning); box.setText(curFile + tr(" 尚未保存,是否保存?")); box.setStandardButtons(QMessageBox::Yes | QMessageBox::No); if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作 do_file_Save(); } } 这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。 6.再添加“保存”操作的函数定义。 void MainWindow::do_file_Save() //保存文件 { if(isSaved){ //如果文件已经保存过,直接保存文件 saveFile(curFile); } else{ do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为 } } 对文件进行保存,先判断其是否已经保存过,如果没有被保存过,就要先对 其进行另存为操作。 7.下面是“另存为”操作的函数定义。 void MainWindow::do_file_SaveAs() //文件另存为 { QString fileName = QFileDialog::getSaveFileName(this,tr("另存为 "),curFile); //获得文件名 if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容 { saveFile(fileName); } } 这里弹出一个文件对话框,显示文件另存为的路径。 8.下面是实际文件存储操作的函数定义。 bool MainWindow::saveFile(const QString& fileName) //保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功 { QFile file(fileName); if(!file.open(QFile::WriteOnly | QFile::Text)) //以只写方式打开文件,如果打开失败则弹出提示框并返回 { QMessageBox::warning(this,tr("保存文件"), tr("无法保存文件 %1:\n %2").arg(fileName) .arg(file.errorString())); return false; } //%1,%2 表示后面的两个arg 参数的值 QTextStream out(&file); //新建流对象,指向选定的文件 out << ui->textEdit->toPlainText(); //将文本编辑器里的内容以纯文本 的形式输出到流对象 isSaved = true; curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路 径 setWindowTitle(curFile); //将窗口名称改为现在窗口的路径 return true; } 这个函数实现将文本文件进行存储。下面我们对其的一些代码进行讲解。 QFile file(fileName);一句,定义了一个QFile 类的对象file,其filename 表明这个文件就是我们保存的的文件。然后我们就可以用file 代替这个文件, 来进行一些操作。Qt 文件的操作和C,C++很相似。对于QFile 类对象怎么使 用,我们可以查看帮助。 点击Qt Creator 最左侧的Help,在其输入QFile, 在搜索到的列表选择QFile 即可。这在右侧会显示出QFile 类所有相关信 息以及他们的用法和说明。 // 我们往下拉,会发现下面有关于怎么读取文件的示例代码。 // // 再往下便能看到用QTextStream 类对象,进行字符串输入的例子。下面也提到了 QFileInfo 和QDir 等相关的类,我们可以点击它们去看一下具体的使用说明。 // 上面只是做了一个简单的说明。以后我们对自己不明白的类都可以去帮助里进行 查找,这也许是我们以后要做的最多的一件事了。对于其的英文解释,我们最 好想办法弄明白它的大意,其实网上也有一些文的翻译,但最好还是从一开始 就尝试着看英文原版的帮助,这样以后才不会对文翻译产生依赖。 我们这次只是很简单的说明了一下怎样使用帮助文件,这不表明 它不重要,而是因为这里不可能将每个类的帮助都解释一遍,没有那么多间, 也没有那么大的篇幅。而更重要的是因为,我们这个教程只是引你入门,所以很 多东西需要自己去尝试。 在以后的教程里,如果不是特殊情况,就不会再对其的类进行 详细解释,文章的重点是对整个程序的描述,其不明白的类,自己查看帮助。 9.双击mainwindow.ui 文件,在图形界面窗口下面的Action Editor 动作编辑 器里,我们右击“新建”菜单一条,选择Go to slot,然后选择triggered(), 进入其触发事件槽函数。 同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数。如下。 void MainWindow::on_action_New_triggered() //信号和槽的关联 { do_file_New(); } void MainWindow::on_action_Save_triggered() { do_file_Save(); } void MainWindow::on_action_SaveAs_triggered() { do_file_SaveAs(); } 这点击运行,就能够实现新建文件保存文件文件另存为的功能了。 然后实现打开关闭,退出,撤销,复制,剪切,粘贴的功能。 先备份上次的工程文件,然后再将其打开。 1.先在mainwindow.h 文件加入函数的声明。 void do_file_Open(); //打开文件 bool do_file_Load(const QString& fileName); //读取文件 2.再在mainwindow.cpp 文件写函数的功能实现。 void MainWindow::do_file_Open()//打开文件 { do_file_SaveOrNot();//是否需要保存现有文件 QString fileName = QFileDialog::getOpenFileName(this); //获得要打开文件的名字 if(!fileName.isEmpty())//如果文件名不为空 { do_file_Load(fileName); } ui->textEdit->setVisible(true);//文本编辑器可见 } bool MainWindow::do_file_Load(const QString& fileName) //读取文件 { QFile file(fileName); if(!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString())); return false; //如果打开文件失败,弹出对话框,并返回 } QTextStream in(&file); ui->textEdit->setText(in.readAll()); //将文件的所有内容都 写到文本编辑器 curFile = QFileInfo(fileName).canonicalFilePath(); setWindowTitle(curFile); return true; } 上面的打开文件函数与文件另存为函数相似,读取文件的函数与文件存储函数相 似。 3.然后按顺序加入更菜单的关联函数,如下。 void MainWindow::on_action_Open_triggered() //打开操作 { do_file_Open(); } // void MainWindow::on_action_Close_triggered() //关闭操作 { do_file_SaveOrNot(); ui->textEdit->setVisible(false); } // void MainWindow::on_action_Quit_triggered() //退出操作 { on_action_Close_triggered(); //先执行关闭操作 qApp->quit(); //再退出系统,qApp 是指向应用程序的全局指针 } // void MainWindow::on_action_Undo_triggered() //撤销操作 { ui->textEdit->undo(); } // void MainWindow::on_action_Cut_triggered() //剪切操作 { ui->textEdit->cut(); } // void MainWindow::on_action_Copy_triggered() //复制操作 { ui->textEdit->copy(); } // void MainWindow::on_action_Past_triggered() //粘贴操作 { ui->textEdit->paste(); } 因为复制,撤销,全选,粘贴,剪切等功能,是TextEdit 默认就有的,所以我 们只需调用一下相应函数就行。 到这里,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经实现了。 七、Qt Creator 实现文本查找(原创) 现在加上查找菜单的功能。因为这里要涉及关于Qt Creator 的很多实用功能, 所以单独用一篇文章来介绍。 以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框。对于 怎么实现查找功能的,我们详细地分步说明了怎么进行类方法的查找和使用。 其也将Qt Creator 智能化的代码补全功能和程序函数的声明位置和定义位 置间的快速切换进行了介绍。 1.首先还是保存以前的工程,然后再将其打开。 我们发现Qt Creator 默认的字体有点小,可以按下Ctrl 键的同按两下+键, 来放大字体。也可以选择Edit->Advanced->Increase Font Size。 2.在mainwindow.h 加入#include <QLineEdit>的头文件包含,在private 添加 QLineEdit *find_textLineEdit; //声明一个行编辑器,用于输入要查找的内容 在private slots 添加 void show_findText(); 在该函数实现查找字符串的功能。 3.我们进入查找菜单的触发事件槽函数,更改如下。 void MainWindow::on_action_Find_triggered() { QDialog *findDlg = new QDialog(this); //新建一个对话框,用于查找操作,this 表明它的父窗口是MainWindow。 findDlg->setWindowTitle(tr("查找")); //设置对话框的标题 find_textLineEdit = new QLineEdit(findDlg); //将行编辑器加入到新建的查找对话框 QPushButton *find_Btn = new QPushButton(tr("查找下一个"),findDlg); //加入一个“查找下一个”的按钮 QVBoxLayout* layout = new QVBoxLayout(findDlg); layout->addWidget(find_textLineEdit); layout->addWidget(find_Btn); //新建一个垂直布局管理器,并将行编辑器和按钮加入其 findDlg ->show(); //显示对话框 connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText())); //设置“查找下一个”按钮的单击事件和其槽函数的关联 } 这里我们直接用代码生成了一个对话框,其一个行编辑器可以输入要查找的字 符,一个按钮可以进行查找操作。我们将这两个部件放到了一个垂直布局管理器 。然后显示这个对话框。并设置了那个按钮单击事件与show_findText()函数 的关联。 5.下面我们开始写实现查找功能的show_findText()函数。 void MainWindow::show_findText()//“查找下一个”按钮的槽函数 { QString findText = find_textLineEdit->text(); //获取行编辑器的内容 } 先用一个QString 类的对象获得要查找的字符。然后我们一步一步写查找操作的 语句。 6.在下一行写下ui,然后直接按下键盘上的“<.”键,这系统会根据是否是 指针对象而自动生成“->”或“.”,因为ui 是指针对象,所以自动生成“->” 号,而且弹出了ui 的所有部件名称的列表。如下图。 7.我们用向下的方向键选列表的textEdit。或者我们可以先输入text,这 能缩减列表的内容。 8.如上图我们将鼠标放到textEdit 上,这便出现了textEdit 的类名信息, 且后面出现一个F1 按键。我们按下键盘上的F1,便能出现textEdit 的帮助。 9.我们在帮助向下拉,会发现这里有一个find 函数。 10.我们点击find,查看其详细说明。 11.可以看到find 函数可以实现文本编辑器字符串的查找。其一个 FindFlags 的参数,我们点击它查看其说明。 12.可以看到它是一个枚举变量(enum),有三个选项,第一项是向后查找(即 查找光标以前的内容,这里的前后是相对的说法,比如第一行已经用完了,光 标在第二行,把第一行叫做向后。),第二项是区分大小写查找,第三项是 查找全部。 13.我们选用第一项,然后写出下面的语句。 ui->textEdit->find(findText,QTextDocument::FindBackward); //将行编辑器的内容在文本编辑器进行查找 当我们刚打出“f”,就能自动弹出textEdit 类的相关属性和方法。 可以看到,当写完函数名和第一个“(”后,系统会自动显示出该函数的函数原 型,这样可以使我们减少出错。 14.这已经能实现查找的功能了。但是我们刚才看到find 的返回值类型是bool 型,而且,我们也应该为查找不到字符串作出提示。 if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1") .arg(findText); } 因为查找失败返回值是false,所以if 条件加了“!”号。在找不到弹出警 告对话框。 15.到这里,查找功能就基本上写完了。show_findText()函数的内容如下。 我们会发现随着程序功能的增强,其的函数也会越来越多,我们都会为查找 某个函数的定义位置感到头疼。而在Qt Creator 有几种快速定位函数的方法, 我们这里讲解三种。 第一,在函数声明的地方直接跳转到函数定义的地方。 如在do_file_Load 上点击鼠标右键,在弹出的菜单选择Follow Symbol under Cursor 或者下面的Switch between Method Declaration/Definition。 这系统就会自动跳转到函数定义的位置。如下图。 第二,快速查找一个文件里的所有函数。 我们可以点击窗口最上面的下拉框,这里会显示本文件所有函数的列表。 第三,利用查找功能。 1.我们先将鼠标定位到一个函数名上。 2.然后选择Edit->Find/Replace->Find Dialog。 3.这出现一个查找对话框,可以看到要查找的函数名已经写在里面了。 4.当我们按下Search 按钮后,会在查找结果窗口显示查找到的结果。 5.我们点击第二个文件。会发现在这个文件有两处关键字是高亮显示。 6.我们双击第二项,就会自动跳转到函数的定义处。 文章讲到这里,我们已经很详细地说明了怎样去使用一个类里面没有用过的方法 函数;也说明了Qt Creator 的一些便捷操作。可以看到,Qt Creator 开发环 境,有很多很人性化的设计,我们应该熟练应用它们。 在以后的文章,我们不会再很详细地去用帮助来说明一个函数是 怎么来的,该怎么用,这些应该自己试着去查找。 八、Qt Creator 实现状态栏显示(原创) 在程序主窗口Mainwindow ,有菜单栏,工具栏,心部件和状态栏。前面几 个已经讲过了,这次讲解状态栏的使用。 程序有哪些不明白的类或函数,自己查看帮助。 1.我们在mainwindow.h 做一下更改。 加入头文件包含: #include <QLabel> 加入私有变量和函数: QLabel* first_statusLabel; //声明两个标签对象,用于显示状态信息 QLabel* second_statusLabel; void init_statusBar(); //初始化状态栏 加入一个槽函数声明:void do_cursorChanged(); //获取光标位置信息 2.在mainwindow.cpp 加入状态栏初始化函数的定义。 void MainWindow::init_statusBar() { QStatusBar* bar = ui->statusBar; //获取状态栏 first_statusLabel = new QLabel; //新建标签 first_statusLabel->setMinimumSize(150,20); //设置标签最小尺寸 first_statusLabel->setFrameShape(QFrame::WinPanel); //设置标签形状 first_statusLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影 second_statusLabel = new QLabel; second_statusLabel->setMinimumSize(150,20); second_statusLabel->setFrameShape(QFrame::WinPanel); second_statusLabel->setFrameShadow(QFrame::Sunken); bar->addWidget(first_statusLabel); bar->addWidget(second_statusLabel); first_statusLabel->setText(tr("欢迎使用文本编辑器")); //初始化内容 second_statusLabel->setText(tr("yafeilinux 制作!")); } 这里将两个标签对象加入到了主窗口的状态栏里,并设置了他们的外观和初值。 3.在构造函数里调用状态栏初始化函数。 init_statusBar(); 这运行程序,效果如下。 4.在mainwindow.cpp 加入获取光标位置的函数的定义。 void MainWindow::do_cursorChanged() { int rowNum = ui->textEdit->document()->blockCount(); //获取光标所在行的行号 const QTextCursor cursor = ui->textEdit->textCursor(); int colNum = cursor.columnNumber(); //获取光标所在列的列号 first_statusLabel->setText(tr("%1 行 %2 列").arg(rowNum).arg(colNum)); //在状态栏显示光标位置 } 这个函数可获取文本编辑框光标的位置,并显示在状态栏。 5.在构造函数添加光标位置改变信号的关联。 connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cur sorChanged())); 这运行程序。效果如下。 6.在do_file_Load 函数的最后添加下面语句。 second_statusLabel->setText(tr("打开文件成功")); 7.在saveFile 函数的最后添加以下语句。 second_statusLabel->setText(tr("保存文件成功")); 8.在on_action_Find_triggered 函数的后面添加如下语句。 second_statusLabel->setText(tr("正在进行查找")); 9.在on_action_Close_triggered 函数最后添加如下语句。 first_statusLabel->setText(tr("文本编辑器已关闭")); second_statusLabel->setText(tr("yafeilinux 制作!")); 到这里整个文本编辑器的程序就算写完了。我们这里没有写帮助菜单的功能实 现,大家可以自己添加。而且程序也有很多漏洞和不完善的地方,如果有兴 趣,大家也可以自己修改。因为间和篇幅的原因,我们这里就不再过多的讲 述。 九、Qt Creator 鼠标键盘事件的处理实现自定义鼠标指针(原创) 我们前面一直在说信号,比方说用鼠标按了一下按钮,这样就会产生一个按钮的 单击信号,然后我们可以在相应的槽函数里进行相应功能的设置。其实在按下鼠 标后,程序要先接收到鼠标按下的事件,然后将这个事件按默认的设置传给按钮。 可以看出,事件和信号并不是一回事,事件比信号更底层。而我们以前把单击按 钮也叫做事件,这是不确切的,不过大家都知道是什么意思,所以当也没有细 分。 Qt 的事件可以在QEvent 查看。下面我们只是找两个例子来进行简单的演示。 1.还是先建立一个Qt4 Gui Application 工程,我这里起名为event。 2.添加代码,让程序可以使用文。 即在main.cpp 文件加入#include <QTextCodec>的头文件包含。 再在下面的主函数里添加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 文件做一下更改。 添加#include <QtGui>头文件。因为这样就包含了QtGui 所有的子文件。 在public 添加两个函数的声明 void mouseMoveEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); 4.我们在mainwindow.ui 添加一个Label 和一个PushButton,将他们拉长点, 因为一会要在上面显示标语。 5.在mainwindow.cpp 的构造函数里添加两个部件的显示文本。 ui->label->setText(tr("按下键盘上的A 键试试!")); ui->pushButton->setText(tr("按下鼠标的一个键,然后移动鼠标试试")); 6.然后在下面进行两个函数的定义。 /*以下是鼠标移动事件*/ void MainWindow::mouseMoveEvent(QMouseEvent *m) {//这里的函数名和参数不能更改 QCursor my(QPixmap("E:/Qt/Qt-Creator-Example/event/time.png")); //为鼠标指针选择图片,注意这里要用绝对路径,且要用“/”,而不能用“\” QApplication::setOverrideCursor(my); //将鼠标指针更改为自己设置的图片 int x = m->pos().x(); int y = m->pos().y(); //获取鼠标现在的位置坐标 ui->pushButton->setText(tr("鼠标现在的坐标是(%1,%2), 哈哈好玩吧 ").arg(x).arg(y)); //将鼠标的位置坐标显示在按钮上 ui->pushButton->move(m->pos()); //让按钮跟随鼠标移动 } /*以下是键盘按下事件*/ void MainWindow::keyPressEvent(QKeyEvent *k) { if(k->key() == Qt::Key_A) //判断是否是A 键按下 { ui->label->setPixmap(QPixmap("E:/Qt/Qt-Creator-Example/event/linux.jp g")); ui->label->resize(100,100); //更改标签图片和大小 } } 注意:这两个函数不是自己新建的,而是对已有函数的重定义,所有函数名和参 数都不能改。第一个函数对鼠标移动事件进行了重写。其实现了鼠标指针的更 改,和按钮跟随鼠标移动的功能。 第二个函数对键盘的A 键按下实现了新的功能。 效果如下。 按下鼠标的一个键,并移动鼠标。 按下键盘上的A 键。 十、Qt Creator 实现定器和产生随机数(原创) 有两种方法实现定器。 第一种。自己建立关联。 1.新建Gui 工程,工程名可以设置为timer。并在主界面上添加一个标签label, 并设置其显示内容为“0000-00-00 00:00:00 星期日”。 2.在mainwindow.h 添加槽函数声明。 private slots: void timerUpDate(); 3.在mainwindow.cpp 添加代码。 添加#include <QtCore>的头文件包含,这样就包含了QtCore 下的所有文件。 构造函数里添加代码: QTimer *timer = new QTimer(this); //新建定器 connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定器计满信号和相应的槽函数 timer->start(1000); //定器开始计,其1000 表示1000ms 即1 秒 4.然后实现更新函数。 void MainWindow::timerUpDate() { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的间 QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); //设置系统间显示格式 ui->label->setText(str); //在标签上显示间 } 5.运行程序,效果如下。 第二种。使用事件。(有点像单片机的定器啊) 1.新建工程。在窗口上添加两个标签。 2.在main.cpp 添加代码,实现文显示。 #include <QTextCodec> QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 添加代码。 void timerEvent(QTimerEvent *); 4.在mainwindow.cpp 添加代码。 添加头文件#include <QtCore> 在构造函数里添加以下代码。 startTimer(1000); //其返回值为1,即其timerId 为1 startTimer(5000);//其返回值为2,即其timerId 为2 startTimer(10000); //其返回值为3,即其timerId 为3 添加了三个定器,它们的timerId 分别为1,2,3。注意,第几个定器的返 回值就为几。所以要注意定器顺序。 在下面添加函数实现。 void MainWindow::timerEvent(QTimerEvent *t) //定器事件 { switch(t->timerId()) //判断定器的句柄 { case 1 : ui->label->setText(tr("每秒产生一个随机数: %1").arg(qrand()%10));break; case 2 : ui->label_2->setText(tr("5 秒后软件将关闭"));break; case 3 : qApp->quit();break; //退出系统 } } 这里添加了三个定器,并都在定器事件判断它们,然后执行相应的功能。 这样就不用每个定器都写一个关联函数和槽函数了。 随机数的实现: 上面程序的qrand(),可以产生随机数,qrand()%10 可以产生0-9 之间的随机 数。要想产生100 以内的随机数就%100。以此类推。 但这样每次启动程序后,都按同一种顺序产生随机数。为了实现每次启动程序产 生不同的初始值。我们可以使用qsrand(time(0));实现设置随机数的初值,而 程序每次启动time(0)返回的值都不同,这样就实现了产生不同初始值的功 能。 我们将qsrand(time(0));一句加入构造函数里。 程序最终运行效果如下。 十一、Qt 2D 绘图(一)绘制简单图形(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载注明出处。 说明:以后使用的环境为基于Qt 4.6 的Qt Creator 1.3.0 windows 版本 本文介绍在窗口上绘制最简单的图形的方法。 1.新建Qt4 Gui Application 工程,我这里使用的工程名为painter01,选用 QDialog 作为Base class 2.在dialog.h 文件声明重绘事件函数void paintEvent(QPaintEvent *); 3.在dialog.cpp 添加绘图类QPainter 的头文件包含#include <QPainter> 4.在下面进行该函数的重定义。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,100); } 其创建了QPainter 类对象,它是用来进行绘制图形的,我们这里画了一条线 Line,其的参数为线的起点(0,0),和终点(100,100)。这里的数值指的 是像素,详细的坐标设置我们以后再讲,这里知道(0,0)点指的是窗口的左上 角即可。运行效果如下: 5.在qt 的帮助里可以查看所有的绘制函数,而且下面还给出了相关的例子。 6.我们下面将几个知识点说明一下,帮助大家更快入门。 将函数改为如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QPen pen; //画笔 pen.setColor(QColor(255,0,0)); QBrush brush(QColor(0,255,0,125)); //画刷 painter.setPen(pen); //添加画笔 painter.setBrush(brush); //添加画刷 painter.drawRect(100,100,200,200); //绘制矩形 } 这里的pen 用来绘制边框,brush 用来进行封闭区域的填充,QColor 类用来提供 颜色,我们这里使用了rgb 方法来生成颜色,即(red,green,blue),它们取 值分别是0-255,例如(255,0,0)表示红色,而全0 表示黑色,全255 表示 白色。后面的(0,255,0,125),其的125 是透明度(alpha)设置,其值 也是从0 到255,0 表示全透明。最后将画笔和画刷添加到painter 绘制设备, 画出图形。这里的Rect 是长方形,其的参数为(100,100)表示起始坐标, 200,200 表示长和宽。效果如下: 7.其实画笔和画刷也有很多设置,大家可以查看帮助。 QPainter painter(this); QPen pen(Qt::DotLine); QBrush brush(Qt::blue); brush.setStyle(Qt::HorPattern); painter.setPen(pen); painter.setBrush(brush); painter.drawRect(100,100,200,200); 这里我们设置了画笔的风格为点线,画刷的风格为并行横线,效果如下: 在帮助里可以看到所有的风格。 我们这里用了Qt::blue,Qt 自定义的几个颜色如下: 8.画弧线,这是帮助里的一个例子。 QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形 int startAngle = 30 * 16; //起始角度 int spanAngle = 120 * 16; //跨越度数 QPainter painter(this); painter.drawArc(rectangle, startAngle, spanAngle); 这里要说明的是,画弧线,角度被分成了十六分之一,就是说,要想为30 度, 就得是30*16。它有起始角度和跨度,还有位置矩形,要想画出自己想要的弧线, 就要有一定的几何知识了。这里就不再祥述。 十二、Qt 2D 绘图(二)渐变填充(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载注明出处。 在qt 提供了三种渐变方式,分别是线性渐变,圆形渐变和圆锥渐变。如果能 熟练应用它们,就能设计出炫目的填充效果。 线性渐变: 1.更改函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QLinearGradient linearGradient(100,150,300,150); //从点(100,150)开始到点(300,150)结束,确定一条直线 linearGradient.setColorAt(0,Qt::red); linearGradient.setColorAt(0.2,Qt::black); linearGradient.setColorAt(0.4,Qt::yellow); linearGradient.setColorAt(0.6,Qt::white); linearGradient.setColorAt(0.8,Qt::green); linearGradient.setColorAt(1,Qt::blue); //将直线开始点设为0,终点设为1,然后分段设置颜色 painter.setBrush(linearGradient); painter.drawRect(100,100,200,100); //绘制矩形,线性渐变线正好在矩形的水平心线上 } 效果如下: 圆形渐变: 1.更改函数内容如下: QRadialGradient radialGradient(200,100,100,200,100); //其参数分别为圆形渐变的圆心(200,100),半径100,和焦点(200, 100) //这里让焦点和圆心重合,从而形成从圆心向外渐变的效果 radialGradient.setColorAt(0,Qt::black); radialGradient.setColorAt(1,Qt::yellow); //渐变从焦点向整个圆进行,焦点为起始点0,圆的边界为1 QPainter painter(this); painter.setBrush(radialGradient); painter.drawEllipse(100,0,200,200); //绘制圆,让它正好和上面的圆形渐变的圆重合 效果如下: 2.要想改变填充的效果,只需要改变焦点的位置和渐变的颜色位置即可。 改变焦点位置:QRadialGradient radialGradient(200,100,100,100,100); 效果如下: 锥形渐变: 1.更改函数内容如下: //圆锥渐变 QConicalGradient conicalGradient(50,50,0); //圆心为(50,50),开始角度为0 conicalGradient.setColorAt(0,Qt::green); conicalGradient.setColorAt(1,Qt::white); //从圆心的0 度角开始逆针填充 QPainter painter(this); painter.setBrush(conicalGradient); painter.drawEllipse(0,0,100,100); 效果如下: 2.可以更改开始角度,来改变填充效果 QConicalGradient conicalGradient(50,50,30); 开始角度设置为30 度,效果如下: 其实三种渐变的设置都在于焦点和渐变颜色的位置,如果想设计出漂亮的渐变 效果,还要有美术功底啊! 十二、Qt 2D 绘图(三)绘制文字(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载注明出处。 接着上一次的教程,这次我们学习在窗体上绘制文字。 1.绘制最简单的文字。 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawText(100,100,"yafeilinux"); } 我们在(100,100)的位置显示了一行文字,效果如下。 2.为了更好的控制字体的位置。我们使用另一个构造函数。在帮助里查看 drawText,如下。 这里我们看到了构造函数的原型和例子。其的flags 参数可以控制字体在矩形 的位置。我们更改函数内容如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QRectF ff(100,100,300,200); //设置一个矩形 painter.drawRect(ff); //为了更直观地看到字体的位置,我们绘制出这个矩形 painter.setPen(QColor(Qt::red)); //设置画笔颜色为红色 painter.drawText(ff,Qt::AlignHCenter,"yafeilinux"); //我们这里先让字体水平居 } 效果如下。 可以看到字符串是在最上面水平居的。如果想让其在矩形正间,我们可以使 用Qt::AlignCenter。 这里我们也可以使用两个枚举变量进行按位与操作,例如可以使用 Qt::AlignBottom|Qt::AlignHCenter 实现让文字显示在矩形下面的正间。效 果如下。 对于较长的字符串,我们也可以利用“\n”进行换行,例如"yafei\nlinux"。效 果如下。 3.如果要使文字更美观,我们就需要使用QFont 类来改变字体。先在帮助查 看一下这个类。 可以看到它有好几个枚举变量来设置字体。下面的例子我们对主要的几个选项进 行演示。 更改函数如下。 void Dialog::paintEvent(QPaintEvent *) { QFont font("Arial",20,QFont::Bold,true); //设置字体的类型,大小,加粗,斜体 font.setUnderline(true); //设置下划线 font.setOverline(true); //设置上划线 font.setCapitalization(QFont::SmallCaps); //设置大小写 font.setLetterSpacing(QFont::AbsoluteSpacing,5); //设置间距 QPainter painter(this); painter.setFont(font); //添加字体 QRectF ff(100,100,300,200); painter.drawRect(ff); painter.setPen(QColor(Qt::red)); painter.drawText(ff,Qt::AlignCenter,"yafeilinux"); } 效果如下。 这里的所有字体我们可以在设计器进行查看。如下。 基于Qt 4.6 的Qt Creator 1.3.0 环境变量设置(原创) 如果你以前安装过visual studio 2005 之类的软件,那么装上Qt Creator 1.3.0 后,编译运行其自带的演示程序就可能出现如下图的,105 个错误,几十个警 告的问题。 我们查看输出窗口,如下图。会发现它居然显示VC98 之类的东西,就是说它并 没有去自己的include 文件夹 查找文件。我们可以怀疑是系统环境变量的问题了。 点击Qt Creator 界面左侧的projects 图标,查看工程信息。这里我们主要查看 编辑环境Buid Environment,点击其右侧的show Details。 可以看到其的include 和lib 均指向了virtual studio 文件夹,我们需要 将其改正。 将他们都改为自己Qt Creator 安装目录下的相关路径,如下图。(要换成你的 安装路径) 改完后会发现新的设置已经显示出来了。 我们查看下面的Run Environment,发现它已经自己改过来了。 回到编辑界面,右击工程文件,在弹出的菜单上选择Clean project,清空以前 的编译信息。 然后运行Run qmake,生成Makefile 文件。 最后,点击run 或者build 都可,这程序已经能正常编译运行了。 基于Qt 4.6 的Qt Creator 1.3.0 写helloworld 程序注意事项(原创) 注意:下面指的是在windows 下,linux 下的情况可进行相应改变 昨天Qt 4.6 和Qt Creator 1.3.0 正式版发布了,但是如果以前用过旧版本,就 可能出一些问题。 1.用debug 方式 如果你以前用了Qt 4.5 的Qt Creator,并且将QtCored4.dll,QtGuid4.dll, mingwm10.dll 等文件放到了C 盘的system 文件夹下。那么先将它们删除,不 然编译不会通过。 编译完helloworld 程序后,如果要直接执行exe 文件,需要将安装目录(新版 Qt)下的qt/bin 目录下的QtCored4.dll,QtGuid4.dll,mingwm10.dll,和 libgcc_s_dw2-1.dll(这个是新增的)文件放在exe 文件夹。或者将它们放到 系统的system 文件夹下。 2.选择release 方式 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录的QtGui4.dll ,Qt Core4.dll, libgcc_s_dw2-1.dll 以及mingwm10.dll 四个文件的支持,将它们拷贝到exe 文 件目录下。 2.程序默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 ‘Qt Creator 发布release 软件相关注意事项(原创) 注意:环境是windows 选择release 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录的QtGui4.dll 和 Qt Core4.dll 以及 mingwm10.dll 三个文件的支持,将它们拷贝到exe 文件目录下。 2.程序默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 Qt Creator 的 error: collect2: ld returned 1 exit status 问题 利用Qt Creator 1.2.1( Built on Sep 30 2009 at 05:21:42)编译 程序经常会出现error: collect2: ld returned 1 exit status 的错误,但是 自己的程序没有一点问题,怎么回事呢? 如果这退出软件,再重新进入,打开刚才的工程,重新编译, 就不会出现刚才的错误了。这应该是Qt Creator 软件的问题吧! 后来发现是因为上次执行的程序还在运行,你打开windows 的任 务管理器的进程可以看见你刚才运行的程序还在执行,我们看不见,是因为它 在后台执行着。出现这个现象,是因为你写的代码的问题,比如在main 函数里 用了w.show();语句,就可能出现界面一闪而过,但它并没有关闭,而是在后台 运行,所以再次运行就会出错。我们可以在资源管理器将该进程关闭,或者 像上面那样直接关闭Qt Creator。 示例: #include <QtGui/QApplication> #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; if(m.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 执行后就会在后台运行。这如果修改了代码再次运行程序,就会出现上面的错 误。 在任务管理器可以看见自己的程序: 将该进程结束,然后在重新运行,就不会出错了。 正确的代码应该这样写: int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; Widget w; if(m.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; //关闭整个程序 } 这样新建的对象w 就不是局部变量了,这样运行程序w 表示的窗口不会一闪而过, 会一直显示。程序也不会再出现上面的错误了。 QT 常用问题解答(转) 本文是我前几天一个网友告诉我的,当看了感觉好,就保存下来。今天再次查 看,感觉有必要把文章分享给各位学习QT 的朋友,因为网上好用的QT 资源真的 好少。 1、如果在窗体关闭前自行判断是否可关闭 答:重新实现这个窗体的closeEvent()函数,加入判断操作 Quote: void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettings(); event->accept(); } else { event->ignore(); } } 2、如何用打开保存文件对话 答:使用QFileDialog Quote: QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { loadFile(fileName); } Quote: QString fileName = QFileDialog::getSaveFileName(this); if (fileName.isEmpty()) { return false; } 3、如果创建Actions(可在菜单和工具栏里使用这些Action) 答: Quote: newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this); newAct->setShortcut(tr("Ctrl+N")); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this); saveAct->setShortcut(tr("Ctrl+S")); saveAct->setStatusTip(tr("Save the document to disk")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); saveAsAct = new QAction(tr("Save &As..."), this); saveAsAct->setStatusTip(tr("Save the document under a new name")); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(tr("Ctrl+Q")); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this); cutAct->setShortcut(tr("Ctrl+X")); cutAct->setStatusTip(tr("Cut the current selection's contents to the " "clipboard")); connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut())); copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this); copyAct->setShortcut(tr("Ctrl+C")); copyAct->setStatusTip(tr("Copy the current selection's contents to the " "clipboard")); connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy())); pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this); pasteAct->setShortcut(tr("Ctrl+V")); pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current " "selection")); connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste())); aboutAct = new QAction(tr("&About"), this); aboutAct->setStatusTip(tr("Show the application's About box")); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); aboutQtAct = new QAction(tr("About &Qt"), this); aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); 4、如果创建主菜单 答:采用上面的QAction 的帮助,创建主菜单 Quote: fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); 5、如果创建工具栏 答:采用上面的QAction 的帮助,创建工具栏 Quote: fileToolBar = addToolBar(tr("File")); fileToolBar->addAction(newAct); fileToolBar->addAction(openAct); fileToolBar->addAction(saveAct); editToolBar = addToolBar(tr("Edit")); editToolBar->addAction(cutAct); editToolBar->addAction(copyAct); editToolBar->addAction(pasteAct); 6、如何使用配置文件保存配置 答:使用QSettings 类 Quote: QSettings settings("Trolltech", "Application Example"); QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); Quote: QSettings settings("Trolltech", "Application Example"); settings.setValue("pos", pos()); settings.setValue("size", size()); 7、如何使用警告、信息等对话框 答:使用QMessageBox 类的静态方法 Quote: int ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Yes) return save(); else if (ret == QMessageBox::Cancel) return false; 8、如何使通用对话框文化 答:对话框的文化 比 如说,QColorDialog 的与文字相关的部分,主要在qcolordialog.cpp 文件 ,我们可以从qcolordialog.cpp 用 lupdate 生成一个ts 文件,然后用自定 义这个ts 文件的翻译,再用lrelease 生成一个.qm 文件,当然了,主程序就要 改变要支持多国语言了, 使用这个.qm 文件就可以了。 另外,还有一个更快的方法,在源代码解开后有一个目录translations,下面 有一些.ts, .qm 文件,我们拷贝一个: Quote: cp src/translations/qt_untranslated.ts ./qt_zh_CN.ts 然 后,我们就用Linguist 打开这个qt_zh_CN.ts,进行翻译了,翻译完成后, 保存后,再用lrelease 命令生成qt_zh_CN.qm, 这样,我们把它加入到我们的 qt project ,那些系统的对话框,菜单等等其它的默认是英文的东西就能显 示成文了。 9、在Windows 下Qt 里为什么没有终端输出? 答:把下面的配置项加入到.pro 文件 Quote: win32:CONFIG += console 10、Qt 4 for X11 OpenSource 版如何静态链接? 答:编译安装的候加上-static 选项 Quote: ./configure -static //一定要加static 选项 gmake gmake install 然后,在Makefile 文件加 static 选项或者在.pro 文件加上QMAKE_LFLAGS += -static,就可以连接静态库了。 11、想在源代码直接使用文,而不使用tr()函数进行转换,怎么办? 答:在main 函数加入下面三条语句,但并不提倡 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); 或者 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 使用GBK 还是使用UTF-8,依源文件汉字使用的内码而定 这样,就可在源文件直接使用文,比如: Quote: QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons); 12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库? 答:这是由于程序找不到数据库插件而致,可照如下解决方法: 在main 函数加入下面语句: Quote: QApplication::addLibraryPath(strPluginsPath"); strPluginsPath 是插件所在目录,比如此目录为/myapplication/plugins 则将需要的sql 驱动,比如qsqlmysql.dll, qsqlodbc.dll 或对应的.so 文件放 到 /myapplication/plugins/sqldrivers/ 目录下面就行了 这是一种解决方法,还有一种通用的解决方法,即在可执行文件目录下写 qt.conf 文件,把系统相关的一些目录配置写到qt.conf 文件里,详细情况情参 考Qt Document Reference 里的qt.conf 部分 13、如何创建QT 使用的DLL(.so)以及如何使用此DLL(.so) 答:创建DLL 其工程使用lib 模板 Quote: TEMPLATE=lib 而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它 程序使用此DLL 需要此头文件 在使用此DLL ,则在此工程源文件引入DLL 头文件,并在.pro 文件加入 下面配置项: Quote: LIBS += -Lyourdlllibpath -lyourdlllibname Windows 下和Linux 下同样(Windows 下生成的DLL 文件名为yourdlllibname.dll 而在Linux 下生成的为libyourdlllibname.so。注意,关于DLL 程序的写法, 遵从各平台级编译器所定的规则。 14、如何启动一个外部程序 答:1、使用QProcess::startDetached()方法,启动外部程序后立即返回; 2、使用QProcess::execute(),不过使用此方法程序会最阻塞直到此方法执 行的程序结束后返回
### 回答1: 首先,在Windows系统隐藏文件夹文件是一项基本的功能。如果您想隐藏您的7个.reg文件夹,您可以按照以下步骤进行操作: 1. 打开文件资源管理器,并转到所需文件夹的位置。 2. 选择您想要隐藏的文件夹。 3. 右键单击所选文件夹,并选择“属性”选项。 4. 在属性窗口,单击“常规”选项卡。 5. 找到“属性”下的“隐藏”选项,并选择“应用于此文件夹,子文件夹文件”。 6. 单击“确定”。 这将隐藏您所选的文件夹,并将其标记为隐藏文件。在接下来的操作,您需要确保显示隐藏文件文件夹的选项是开启的,这样您才能访问这些文件夹。 为了显示隐藏的7个.reg文件夹,您可以按照以下步骤进行操作: 1. 打开文件资源管理器。 2. 单击“查看”选项卡,然后单击“选项”按钮。 3. 在“文件夹选项”窗口,单击“查看”选项卡。 4. 找到“隐藏已知文件类型的扩展名”和“隐藏受保护的操作系统文件(推荐)”选项,并取消选这两个选项。 5. 单击“应用”和“确定”按钮。 这样,您就可以找到并访问您隐藏的7个.reg文件夹了。记住,在进行任何更改之前备份所有重要的文件文件夹,以避免不必要的数据损失。 ### 回答2: 隐藏7个文件夹.reg的方法其实并不复杂,只需要进行简单的操作即可实现。步骤如下: 1. 打开计算机,找到需要隐藏的文件夹.reg。 2. 右键单击该文件夹,选择“属性”。 3. 在弹出的窗口,找到“属性”选项卡,并勾选“隐藏”。 4. 点击“应用”按钮,确认设置。 5. 在确认隐藏后,文件夹.reg便已经消失了。 6. 如果需要再次显示该文件夹,只需要在文件资源管理器点击“查看-选项-更改文件夹和搜索选项”。 7. 在弹出的“文件夹选项”窗口,找到“查看”选项卡,在“隐藏已知文件类型的扩展名”前取消勾选。 8. 点击“应用”,确认设置。 9. 此,隐藏的文件夹.reg就会再次显示出来。 值得注意的是,以上方法是针对Windows系统的操作,如果使用的是其他操作系统,可能需要采用不同的方法来实现隐藏文件夹的功能。同,隐藏文件夹的行为虽然可以有效保护文件的安全,但也需要谨慎使用,避免不必要的麻烦。 ### 回答3: 隐藏7个.reg文件夹非常简单,只需要进行以下步骤即可: 1. 打开文件夹,找到需要隐藏的7个.reg文件夹。 2. 选择要隐藏的每个文件夹,右键单击。 3. 在弹出的选项选择“属性”。 4. 在“属性”窗口,勾选“隐藏”复选框。 5. 点击“应用”和“确定”按钮,关闭窗口。 这样,你的7个.reg文件夹将被隐藏。要在未来找到这些隐藏的文件夹,可以按照以下步骤解除隐藏: 1. 打开文件夹,单击左上角的“文件”选项。 2. 在弹出的选项选择“更改文件夹和搜索选项”。 3. 在“文件夹选项”窗口,选择“查看”选项卡。 4. 在“高级设置”,找到“隐藏受保护的操作系统文件(建议)”选项。 5. 取消选该选项,然后单击“应用”和“确定”按钮。 6. 现在,你可以在文件夹看到所有隐藏的文件夹,包括那7个.reg文件夹。 这就是如何隐藏和解除隐藏7个.reg文件夹的简单步骤。记得保留好这些文件夹,以免意外删除后无法找回。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式职场

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值