X17操作系统部分01

本文介绍了X17操作系统的概述,探讨了其特点、功能,并概述了操作系统的发展与分类,提供了深入理解该系统的补充内容。

系统概述

操作系统的特点

		/*
        操作系统概述
        操作系统是软件与硬件的桥梁

        了解操作系统的特点
            并发性
            就是比如你一边打游戏,一边听音乐
            相当于多线程,单核CPU在任务间频繁切换
            就让你感觉多个任务同时进行一样,宏观上看起来就像同时进行
            对应并行,就是3块CPU分别实行3个任务
            并发宏观上看起来是并行

            共享性
            同一块CPU分给了多个任务同时使用
            官方说法是系统中的资源
            可供内存中多个并发执行的
            线程或进程共同使用
            然后有两个共享方式
            互斥共享方式:
                比如说一个音乐播放器,或者播放设备
                只能一次性播放一首曲子
                完后再播放其它音乐
            同时访问方式
            	就是上面说的
                比如你打游戏,和你听音乐
                可以同时访问
                这个访问也是宏观看起来像并行的

            虚拟性
            还是拿并发宏观上看起来是并行来说
            看起来像是把一块CPU分成了3个
            官方说法是通过某种技术
            把一个物理实体变为若干个逻辑对应物
            还可以分两种:
            时分复用技术
                虚拟处理机技术
                    就是让CPU在任务间频繁切换
                    使得并发宏观上看起来是并行
                虚拟设备技术
                    就是外设
                    比如将打印机交给多个进程用
            空分复用技术
                虚拟磁盘技术
                    我们的电脑只有一块硬盘
                    但在文件资源管理器中
                    显示了4块:CDEF
                    这样会让盘清晰地分类
                虚拟存储器技术
                    就是虚拟内存
                    Linux上叫做交换空间
                    举个装系统的例子
                    装个系统win10,有几10个G
                    但我的电脑只有16G
                    这个时候用到了虚拟内存技术
                    系统软件可以分时分段载入内存
                    不需要全部载入,不需要的可以导出
                    所以,表面上看起来
                    你有一块比16G更大的内存空间
            异步性
                还是拿并发宏观上看起来是并行来说
                这里有3个线程
                每个线程断断续续,随机执行
                不按顺序,就叫异步
         */

操作系统的功能

		/*
        操作系统的功能
            功能1:用户与硬件的接口
            通过下面几种方式
                命令方式:就相当于命令行工具,有两种方式
                    联机命令,也叫交互式命令
                        就是一句一句命令,操作系统一般会给出反馈
                        有时候需要根据反馈输入下一个命令,就是有一个交互的过程
                    脱机命令,也叫批处理命令
                        举个例子,就是把一堆命令写到记事本里面再改为.bat文件
                        就相当于把一堆命令列成清单,交给命令行处理
                        不去与命令行交互
                系统调用方式:系统直接供用户调用的函数,比如关机指令
                		系统调用专门供应用程序使用
                		也可以读取某一个逻辑磁盘块,逻辑磁盘块指的类似于数组的元素
                图形,窗口方式:window提供关闭,放大和最小化操作都是图形,窗口方式
                还有类似window下的.bat文件,DOS窗口的批命令文件和UNIX下的shell文件等

            功能2:资源管理者
                处理机管理:分配和控制处理机,就是控制CPU做什么任务
                存储器管理:主要负责内存的分配与回收,比如C语言变量就是存储在操作系统里面的,垃圾回收也是操作系统做的
                I/O设备管理:就是输入输出设备,比如你启动打印机
                文件管理:负责文件的存取,共享和保护,以后会细讲

            功能3:扩充机器
                也叫做虚拟机器,比如汇编语言编译器,解释器等
                充当了软件的功能
         */

操作系统的发展与分类

		/*
        操作系统的发展与分类
            手工操作,就是无操作系统
                就是没有覆盖在机器上的操作系统软件
                只能是人工操作硬件,操作系统就是人,这台机器所有资源都由人来调度
                缺点是CPU很慢,只有一个用户能用
            批处理系统,操作系统开始出现
                没有交互的,一次性可以执行大量任务的操作系统,分为两个批处理系统
                    单道批处理系统的特点:
                        自动性(此任务完成自动切换到下一个),单道性(每次只能处理一个任务),顺序性(按顺序处理任务)
                        缺点:IO操作,就是输入输出操作时,CPU无事可做,CPU只能等IO操作提供数据
                    多道批处理系统的特点:
                        多道性,宏观上任务并行,微观上任务串行
                        优点:CPU利用率提高,内存利用率提高,IO设备利用率提高(比如你可以一边放视频显示器,一边放音乐播放器),
                        因此系统吞吐量提高
                    总的来说:
                        缺点:没有交互性
                        需要解决的问题:处理器管理问题,内存管理问题,IO设备管理问题,文件管理问题等
                        这里注意,计算操作对于IO操作来说,是不能并发执行的,如果有两个作业,不能同时计算,只能等上一个任务计算完毕
            分时操作系统
                特点:多路性,独立性,及时性,交互性
            实时操作系统
                特点:多路性,独立性,及时性,交互性和可靠性

                多路性:可以按照划分极小的时间片来分给不同的用户,
                    比如第1毫秒分给A,下一毫秒分给B,让两个用户误以为自己独占了操作系统
                独立性:宏观上让用户感觉这个操作系统是为自己独立存在的,照这么说,可以按独占性来理解
                交互性:操作系统会给用户反馈,用户根据反馈来进行下一步命令
                及时性:就是操作系统在根据用户的命令进行反馈的时候很快,就很及时
                可靠性:更加严格了,像政府机构和军事基地,比如军工厂的防御系统,对及时性有硬性要求

            微机操作系统,了解就行
                单用户单任务:微软的dos系统
                单用户多任务:window系统
                多用户多任务:unix,Linux等
         */

操作系统概述补充内容

		/*
        补充知识点:
            需要压栈保存的数据
                程序计数器保存当前指令的地址,不保存的话就会忘记要执行的是哪一条指令
                通用数据寄存器和通用地址寄存器缓存了当前指令所需要的数据
                程序状态字寄存器,系统的状态,是在核心态还是在用户态
                但在中断的时候,可能会发生用户态到内存态的转换
            操作系统提供给用户的资源是
                总的来说,硬件和软件
                包括处理机,存储器,IO设备等
            访管中断
                目态下使用特权指令,目态向管态转变的中断
         */
	/*
    倒排文件
         文件检索里面已经有了很多方法
         让我们很容易根据一个记录的关键码查找到该记录全部信息的存放位置
         从而能拿到该记录的全部其他属性值

         但是在实际检索应用中
         我们还经常需要根据记录中的
         其他一些非关键码的数据项来作查

         也就是根据属性的值来查找记录
         所以我们也要对属性值建立索引
         即索引表中的每一项均由一个具体可能出现的属性值
         和给该值的记录地址两部分组成

         这样,我们可以通过记录的某一项属性值
         反过来查找到这个记录的存放地址,或者记录对应的关键码
         我们称这种索引为倒排索引(inverted index)
         拥有倒排索引的文件被称为倒排索引文件
         简称倒排文件(inverted file)
     */

总目录

<think>好的,我现在要解决用户的问题:在Qt中将固定尺寸的Widget(1268x726)导出为适合A4纸的PDF时,为什么得到的pageRect尺寸只有23x17像素,而不是根据Widget大小进行缩放。 首先,用户提到pageRect的尺寸异常小,只有23x17像素。这可能与Qt中QPrinter的单位设置有关。根据之前的回答,用户可能在使用QPrinter时没有正确设置单位,导致获取的pageRect不是预期的像素单位。需要确认用户是否在调用pageRect时指定了正确的单位参数,比如QPrinter::DevicePixel。如果使用的是默认的QPrinter::DevicePixel,那可能需要检查分辨率设置是否正确。 接下来,用户想知道如何正确生成适合A4纸的PDF。根据引用[1],iText库可以通过设置页面大小,比如A4,并支持自定义尺寸。但在Qt中,使用的是QPrinter或QPdfWriter。需要确保在设置页面大小时指定为A4,并且正确计算缩放比例。之前的回答中提到的DPI校准和动态缩放是关键,可能需要检查用户代码中的DPI设置是否正确,比如是否设置了高分辨率(如300 DPI),以及是否计算了正确的缩放因子。 然后,用户的问题可能出在单位混淆上。QPrinter默认可能使用不同的单位,比如点(point)或毫米,而不是像素。当用户获取pageRect时,如果没有指定单位为DevicePixel,可能会得到以点为单位的尺寸,导致数值远小于预期。例如,A4纸的尺寸是210x297毫米,转换为点(1点=1/72英寸)大约是595x842点,但如果DPI设置为72,则对应的像素也是595x842。如果用户没有正确设置DPI,或者单位转换错误,可能导致获取的pageRect尺寸错误。 需要检查用户的代码中是否设置了正确的DPI,例如使用printer.setResolution(300)来确保高分辨率。同时,确认在获取pageRect时使用了QPrinter::DevicePixel参数,以像素为单位。如果这些设置正确,但pageRect仍然很小,可能是因为默认的QPrinter分辨率较低(比如72 DPI),导致像素尺寸计算错误。 此外,用户提到的界面Widget大小为1268x726,需要将这个尺寸缩放到A4纸上。根据之前的回答,计算缩放比例时需要考虑DPI和物理尺寸。例如,A4纸的物理尺寸是210x297毫米,在300 DPI下对应的像素尺寸约为2480x3508像素。然后,将Widget的尺寸按比例缩放,保留边距,确保内容适应页面。 可能用户没有正确应用缩放变换,导致内容被错误地缩小。检查用户代码中的坐标变换部分,是否正确地平移和缩放了QPainter,确保Widget的中心与页面中心对齐,并且应用了正确的缩放因子。 总结可能的原因: 1. QPrinter的单位未正确设置为像素,导致pageRect尺寸错误。 2. DPI设置过低,导致像素尺寸计算不准确。 3. 未正确应用缩放变换,导致内容无法正确适配页面。 4. 页面边距未被考虑,导致可用区域变小。 解决方案应包括: - 设置高DPI(如300)以确保足够的像素数量。 - 在获取pageRect时使用DevicePixel单位。 - 正确计算缩放比例,考虑边距。 - 应用坐标变换,将Widget内容缩放到合适的大小。 最后,验证生成的PDF是否符合A4物理尺寸,并检查清晰度。可能还需要处理抗锯齿和图像质量,避免模糊或锯齿现象。</think>### **问题分析:pageRect尺寸异常原因** #### 1. **单位系统误解**(核心原因) Qt中`QPrinter::pageRect()`默认返回**逻辑坐标**(单位为1/72英寸),而非实际像素。当未显式设置分辨率时,系统默认使用72 DPI(1逻辑单位=1像素),导致: $$ \text{实际像素尺寸} = \text{逻辑单位尺寸} \times \frac{\text{DPI}}{72} $$ 若未正确设置DPI,`pageRect(QPrinter::DevicePixel)`将返回错误的小尺寸值[^1]。 --- ### **解决方案:精确控制物理尺寸** #### 1. **设置打印机分辨率** ```cpp QPrinter printer(QPrinter::HighResolution); printer.setResolution(300); // 强制指定300 DPI printer.setPageSize(QPageSize(QPageSize::A4)); // 物理尺寸210×297mm ``` #### 2. **获取真实像素区域** ```cpp // 明确指定单位为DevicePixel(物理像素) QRectF pagePixelRect = printer.pageRect(QPrinter::DevicePixel); // 300 DPI时返回约2480×3508像素 ``` --- ### **尺寸对比验证** | 参数 | 72 DPI | 300 DPI | 物理尺寸 | |---------------------|-----------------|----------------|------------| | A4纸逻辑单位 | 595×842 points | 595×842 points | 210×297mm | | pageRect(DevicePixel)| 595×842 pixels | 2480×3508 pixels | - | | Widget尺寸 | 1268×726 pixels | 1268×726 pixels | - | --- ### **关键代码修正** #### 1. **添加DPI配置** ```cpp printer.setFullPage(true); // 消除系统默认边距影响 printer.setResolution(300); // 必须显式设置分辨率 ``` #### 2. **动态缩放计算** ```cpp // 计算实际可用像素区域(考虑打印机物理边距) QRectF realPrintableArea = printer.pageRect(QPrinter::DevicePixel); // 缩放因子计算(保留5%安全边距) double scale = qMin( realPrintableArea.width() * 0.95 / widget->width(), realPrintableArea.height() * 0.95 / widget->height() ); // 坐标系变换(中心对齐) QPainter painter(&printer); painter.translate(realPrintableArea.center()); painter.scale(scale, scale); painter.translate(-widget->rect().center()); ``` --- ### **调试技巧** #### 1. **打印参数诊断** ```cpp qDebug() << "实际DPI:" << printer.resolution(); qDebug() << "逻辑单位pageRect:" << printer.pageRect(QPrinter::Point); qDebug() << "物理像素pageRect:" << printer.pageRect(QPrinter::DevicePixel); ``` #### 2. **边界可视化** ```cpp // 绘制Widget轮廓和页面边界 painter.setPen(Qt::red); painter.drawRect(widget->rect()); // Widget实际绘制区域 painter.setPen(Qt::blue); painter.drawRect(printer.paperRect(QPrinter::DevicePixel)); // 纸张物理边界 ``` --- ### **为何需要显式设置DPI?** Qt打印系统默认继承操作系统DPI(通常96或72),但高精度打印需手动指定。通过: $$ \text{像素尺寸} = \text{物理尺寸(mm)} \times \frac{\text{DPI}}{25.4} $$ 当设置300 DPI时,A4纸宽度像素为: $$ 210 \times \frac{300}{25.4} ≈ 2480 \ \text{pixels} $$ 未设置时若按72 DPI计算,则得到: $$ 210 \times \frac{72}{25.4} ≈ 595 \ \text{pixels} $$ **这正是23×17像素问题的根源**(可能因边距计算进一步缩小)[^1]。 --- ### **进阶优化:QPdfWriter直接控制** ```cpp QPdfWriter pdfWriter("output.pdf"); pdfWriter.setResolution(300); // 独立于系统设置 pdfWriter.setPageSize(QPageSize(QPageSize::A4)); QPainter painter(&pdfWriter); // 其余缩放逻辑与QPrinter方案相同 ``` 优势:避免操作系统打印服务差异,精确控制PDF元数据[^2]。 --- ### **相关技术栈延伸** | 技术点 | 作用 | |---------------------|--------------------------------------------------------------------| | `QPageLayout` | 精确控制页边距、方向(通过`setMargins()`和`setOrientation()`) | | `QImageWriter` | 导出为位图格式时控制压缩率(如JPEG质量参数) | | `QSvgGenerator` | 矢量图形导出为SVG,避免缩放失真 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

muskfans

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

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

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

打赏作者

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

抵扣说明:

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

余额充值