news 2026/9/2 16:51:38

网易版《我的世界》函数指令全解析:从零构建自动化系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网易版《我的世界》函数指令全解析:从零构建自动化系统

在网易版《我的世界》中,你是否曾羡慕过那些能一键建造宏伟建筑、瞬间召唤千军万马、或是实现复杂自动化流程的玩家?这些看似神奇的操作,背后往往离不开一个强大但常被新手忽视的功能——函数(Function)。它就像游戏内置的“脚本”或“宏”,能将一系列指令打包成一个可重复执行的命令单元,是实现自动化、创建复杂玩法、甚至制作小游戏的核心工具。然而,面对冰冷的.mcfunction文件和复杂的指令语法,许多玩家望而却步,只能停留在手动输入单条指令的阶段。

本文将为你彻底揭开网易版《我的世界》函数指令的神秘面纱。无论你是刚接触指令的萌新,还是想提升效率的进阶玩家,都能通过这篇教程,从零开始,一步步学会如何创建、编写、调试并应用函数。我们将从最基础的概念讲起,手把手带你搭建函数包,编写第一个函数,并最终实现一个自动化的农场或陷阱系统。学完本文,你将能独立制作属于自己的指令模块,大幅提升游戏体验和创作效率。

1. 函数(Function)指令的核心概念与价值

在深入实操之前,我们有必要厘清“函数”在《我的世界》指令体系中的定位,以及它为何如此重要。

1.1 什么是函数(Function)?

你可以将函数理解为一个文本文件,其内部按行存储了一系列《我的世界》的指令。这个文件以.mcfunction为后缀名。当游戏执行这个函数时,它会从上到下、逐行地运行文件中的所有指令,其速度极快,几乎是在同一游戏刻内完成。

与直接在聊天框或命令方块中输入指令相比,函数具有以下本质区别:

  • 批量执行:无需手动逐个触发,一次调用即可运行数十、上百条指令。
  • 模块化与复用:将特定功能(如“清理垃圾实体”、“开启活动”)封装成一个函数,可以在不同地图、不同时机反复调用。
  • 易于维护与更新:修改一个.mcfunction文件,即可更新所有调用该函数的功能,无需寻找并修改散落各处的命令方块。
  • 更强的逻辑控制:可以结合计分板、标签等,实现条件判断、循环等复杂逻辑(虽然本身不支持if语法,但可通过技巧实现)。

1.2 为什么网易版玩家必须掌握函数?

对于网易版玩家而言,掌握函数有着特别的实用价值:

  1. 突破交互限制:在联机大厅或租赁服中,直接使用命令方块可能受到权限或数量限制。而函数作为数据包的一部分,可以由地图作者预先配置好,玩家通过简单的触发(如按下按钮、获得物品)即可调用复杂功能,体验更流畅。
  2. 提升地图制作效率:如果你是地图作者,使用函数可以让你从繁琐的命令方块布线中解放出来。逻辑更清晰,地图结构更整洁,后期调试和修改也更为方便。
  3. 实现高级自动化:无论是全自动农场、红石音乐序列,还是 RPG 地图中的技能系统,其核心往往都是由函数驱动的。理解函数是迈向高级玩法创作的必经之路。
  4. 性能更优:相比大量高频红石脉冲激活的命令方块,运行一个函数对游戏性能(TPS)的消耗通常更低。

1.3 函数、数据包与行为包的关系

这是一个常见的困惑点。在网易版《我的世界》中:

  • 数据包(Data Pack):主要用于添加或修改游戏内容,如进度、战利品表、配方、结构、函数以及标签等。它是我们存放函数的主要容器。
  • 行为包(Behavior Pack):主要用于修改或定义实体、物品等的行为,通常与附加包(Add-On)开发关联更紧密。
  • 函数是数据包中的一个核心组成部分。我们创建一个数据包,主要目的之一就是为了在里面组织我们的函数。

简单来说:我们要用函数,通常就需要先创建一个数据包,然后把函数文件放在数据包指定的目录里。

2. 环境准备:网易版《我的世界》函数开发全配置

在网易版中进行函数开发,你需要准备两样东西:一是用于创建和编辑函数文件的外部工具,二是游戏内加载数据包的环境。

2.1 工具准备:文本编辑器

.mcfunction文件是纯文本文件,理论上任何文本编辑器都能打开。但为了获得更好的体验(如语法高亮、错误提示),推荐以下工具:

  • Visual Studio Code (VSCode):首选。通过安装扩展“Minecraft Function、Tag、Objective and Scoreboard Provider”或“Minecraft Language Server”,可以获得指令的自动补全、语法高亮和错误检查,极大提升编写效率。
  • Notepad++:轻量级选择,具备基础的语法高亮功能。
  • 系统自带记事本:作为最后的选择,不推荐,因为缺乏格式支持,容易出错。

2.2 游戏环境准备

  1. 版本确认:确保你的网易版《我的世界》更新到了较新的版本(推荐1.16及以上),因为高版本对数据包和函数的支持更完善、功能更强大。
  2. 开启实验性玩法:在创建新的世界时,必须在“更多世界选项”中打开“实验性玩法”下的“即将推出的创作者功能”(或类似表述,不同版本名称可能略有差异)。这是启用完整数据包功能的必要条件。
  3. 世界类型建议:为了测试方便,建议创建一个创造模式的新世界,并开启允许作弊。这可以让你在游戏内自由使用命令来调用和测试函数。

2.3 理解文件结构:数据包的标准格式

这是最关键的一步。所有数据包都必须遵循一个特定的文件夹结构,游戏才能识别。我们将在电脑的某个位置(如桌面)创建这个结构。

一个最基础的数据包(假设我们命名为my_first_datapack)目录结构如下:

my_first_datapack/ (数据包根文件夹,名字自定) │ ├── pack.mcmeta (数据包描述文件,必需) └── data/ └── minecraft/ └── tags/ └── functions/ └── tick.json (可选,用于每游戏刻执行的函数) └── load.json (可选,用于加载时执行的函数) └── <命名空间>/ (你的自定义命名空间,例如 `mypack`) └── functions/ (存放所有 .mcfunction 文件的文件夹) └── hello.mcfunction (你的第一个函数文件) └── tools/ └── give_tool.mcfunction (可以分子文件夹组织)

关键目录解释:

  • pack.mcmeta:告诉游戏这是一个数据包,并包含描述信息。
  • data/minecraft/tags/functions/:这里存放着特殊的“函数标签”文件,如tick.jsonload.json。它们用于声明哪些函数会在游戏每刻自动运行(tick)或在数据包加载时运行(load)。初学者可先跳过。
  • data/<命名空间>/functions/:这是你工作的核心区域。<命名空间>是你自定义的一个名字,通常用小写英文,用于避免和你或其他人的函数冲突。所有你自己的.mcfunction文件都必须放在这个functions文件夹或其子文件夹下。

3. 创建你的第一个数据包与函数

让我们从零开始,完成一个经典的“Hello, World!”示例。

3.1 第一步:创建数据包文件夹和描述文件

  1. 在桌面新建一个文件夹,命名为my_first_datapack
  2. 在该文件夹内,用文本编辑器新建一个文件,命名为pack.mcmeta(注意没有其他后缀)。
  3. pack.mcmeta文件中输入以下内容:
{ "pack": { "pack_format": 10, "description": "我的第一个函数数据包 - by CSDN教程" } }
  • "pack_format":这个数字代表数据包格式版本,必须与你的游戏版本匹配。对于 Minecraft 1.20~1.21,通常使用 10 或更高。如果加载失败,可以尝试降低此数值(如9、8)。
  • "description":数据包的描述,会在游戏内显示。

3.2 第二步:创建函数文件

  1. my_first_datapack文件夹内,依次新建文件夹:data->mypack->functions。最终路径为my_first_datapack/data/mypack/functions
  2. functions文件夹内,新建一个文本文件,将其重命名为hello.mcfunction(确保扩展名是.mcfunction,而不是.txt)。
  3. 用文本编辑器打开hello.mcfunction,输入你的第一条指令:
say 你好,CSDN!这是我的第一个函数!
  • say指令会向所有玩家广播一条信息。
  • 注意:函数文件中的指令不需要以斜杠/开头。直接写指令本身即可。

3.3 第三步:在游戏中加载并运行数据包

  1. 启动网易版《我的世界》,进入你之前创建的、开启了实验性玩法和作弊的创造模式世界。
  2. 打开聊天框(按T键),输入以下命令将数据包文件夹打包成.zip文件并加载(假设你的数据包在桌面):
    /datapack enable "file:///C:/Users/你的用户名/Desktop/my_first_datapack.zip"
    注意:你需要先将my_first_datapack文件夹压缩成my_first_datapack.zip文件。同时,将路径中的“你的用户名”替换成你自己电脑的用户名。更简单的方法:直接将my_first_datapack文件夹拖入游戏存档的datapacks文件夹。存档路径通常位于MCLDownload/Game/.minecraft/saves/你的世界名/datapacks/。放入后,在游戏内输入/reload重载即可。
  3. 数据包加载成功后,在聊天框输入命令来运行你的函数:
    /function mypack:hello
    • mypack是你之前创建的命名空间。
    • hello是你的函数文件名(不带.mcfunction后缀)。
    • 中间用冒号:连接。

如果一切顺利,所有玩家都会看到一条系统消息:“[@] 你好,CSDN!这是我的第一个函数!”。恭喜你,第一个函数成功运行了!

4. 函数指令的核心语法与高级技巧

掌握了基础流程后,我们来深入学习函数文件的编写规范和一些核心技巧。

4.1 函数文件编写规范

  1. 一行一条指令:每条指令必须独占一行。换行即表示指令结束。
  2. 无需斜杠:函数内的指令绝对不能/开头。
  3. 注释:你可以使用井号#来添加注释,该行#之后的内容会被游戏忽略。
    # 这是一个注释 say 开始执行清理任务 kill @e[type=item] # 这条指令会清除所有掉落物
  4. 执行者与位置:函数中的指令默认以函数执行者的身份在函数调用位置执行。这通常很重要,尤其是在使用@p(最近玩家)、@s(执行者自身)等选择器时。

4.2 实现条件判断与循环

函数本身没有iffor语句,但我们可以通过《我的世界》原生命令的组合来模拟。

  • 条件判断:利用execute命令。

    # 如果最近的玩家叫“Steve”,就给他一个苹果 execute as @p[name=Steve] run give @s apple # 如果执行者脚下是草方块,就说“站在草地上” execute at @s if block ~ ~-1 ~ minecraft:grass_block run say 站在草地上

    execute if是进行条件判断的核心。

  • 循环:利用函数递归调用或schedule命令。

    • 递归函数:函数调用自身。务必设置终止条件,否则会导致游戏卡顿甚至崩溃!
      # 在 loop.mcfunction 中 # 假设我们用一个计分板“count”来控制循环次数 execute if score @s count matches ..5 run function mypack:do_something execute if score @s count matches ..5 run scoreboard players add @s count 1 execute if score @s count matches ..5 run function mypack:loop # 递归调用
    • schedule函数:可以延迟执行函数,实现定时或间隔循环,更安全。
      # 延迟20 ticks(1秒)后再次执行自己,实现每秒一次的循环 schedule function mypack:my_loop 20t

4.3 向函数传递参数:使用计分板或存储(Storage)

函数本身不支持直接传入参数,但我们可以借助游戏内其他系统来模拟。

  • 计分板(Scoreboard):最常用的方法。在调用函数前,先设置某个实体的分数。

    # 调用函数前,设置“循环次数” scoreboard players set @s my_loop_count 10 function mypack:start_loop # 在 start_loop.mcfunction 中 execute if score @s my_loop_count matches 1.. run say 开始循环 execute if score @s my_loop_count matches 1.. run function mypack:loop_body execute if score @s my_loop_count matches 1.. run scoreboard players remove @s my_loop_count 1 execute if score @s my_loop_count matches 1.. run function mypack:start_loop # 递归
  • 数据存储(Data Storage):适用于存储更复杂的NBT数据。功能强大但语法稍复杂。

    # 将数据存入全局存储 data modify storage mypack:data value set value {item:"diamond_sword", count:1} # 在函数中读取并使用 execute store result score @s temp run data get storage mypack:data value.count

4.4 函数标签(Tags):批量管理与自动执行

tick.jsonload.json是特殊的函数标签,让你能定义自动执行的函数。

  1. 创建标签文件:在data/minecraft/tags/functions/目录下创建tick.json
  2. 编辑tick.json
    { "values": [ "mypack:heartbeat", "mypack:weather_check" ] }
    这个文件列出了所有需要在每个游戏刻(每秒20次)自动运行的函数。谨慎添加,性能敏感!
  3. 创建对应的函数:在mypack/functions/下创建heartbeat.mcfunctionweather_check.mcfunction,编写你希望每刻执行的逻辑(例如,检测玩家状态、更新自定义HUD)。

load.json格式相同,其中的函数只会在数据包加载或重载时执行一次,常用于初始化计分板、给予初始物品等。

5. 完整实战案例:制作一个智能自动农场系统

现在,我们将综合运用以上知识,创建一个相对完整的系统:一个智能西瓜/南瓜农场。功能包括:自动检测作物成熟、自动收割、自动收集、并给予玩家反馈。

5.1 项目结构与设计

我们创建以下函数文件:

  • farm/init.mcfunction:初始化系统(设置计分板,放置收割用盔甲架)。
  • farm/harvest.mcfunction:核心收割逻辑。
  • farm/check.mcfunction:检测作物是否成熟。
  • farm/feedback.mcfunction:向玩家发送收割报告。

5.2 核心代码实现

第一步:初始化函数 (farm/init.mcfunction)

# farm/init.mcfunction # 初始化一个用于标记农场状态的计分板 scoreboard objectives add farm_state dummy # 在特定坐标(例如,农场中心)生成一个标记实体(盔甲架),并给它标签“harvester” summon armor_stand 100 64 200 {Tags:["harvester"],Invisible:1,Marker:1,NoGravity:1,CustomName:'"农场收割者"'} say [农场系统] 初始化完成!

将此函数放入data/mypack/functions/farm/init.mcfunction

第二步:检测函数 (farm/check.mcfunction)

# farm/check.mcfunction # 这个函数将由tick.json每刻调用,但为了性能,我们让它每10秒(200gt)检测一次 scoreboard players add @s timer 1 execute if score @s timer matches 200.. run function mypack:farm/harvest execute if score @s timer matches 200.. run scoreboard players set @s timer 0 # 在 harvest 函数内部,我们会检测特定区域的成熟西瓜梗

注意:更高效的做法是使用schedule来定时,这里为了演示计分板用法。

第三步:收割函数 (farm/harvest.mcfunction)

# farm/harvest.mcfunction # 1. 找到“harvester”盔甲架,并移动到它那里执行 execute as @e[type=armor_stand,tag=harvester,limit=1] at @s run function mypack:farm/_harvest_at # 内部函数 _harvest_at.mcfunction (mypack/functions/farm/_harvest_at.mcfunction) # 2. 定义收割区域(例如,以盔甲架为中心,XZ方向各±5,Y方向±1格) execute at @s positioned ~-5 ~-1 ~-5 run function mypack:farm/_scan_block # 内部函数 _scan_block.mcfunction (这是一个简化示例,实际需遍历区域) # 3. 检测并破坏成熟的西瓜或南瓜 execute if block ~ ~ ~ minecraft:attached_melon_stem[facing=east] run setblock ~ ~ ~ minecraft:air execute if block ~ ~ ~ minecraft:attached_pumpkin_stem[facing=east] run setblock ~ ~ ~ minecraft:air # 注意:上述条件不完整,实际需要检测所有朝向,并破坏的是西瓜/南瓜方块本身,而非梗。 # 4. 将掉落物收集到玩家附近(假设最近玩家是农场主) execute as @e[type=item,nbt={Item:{id:"minecraft:melon_slice"}},distance=..10] at @s run tp @s @p execute as @e[type=item,nbt={Item:{id:"minecraft:pumpkin"}},distance=..10] at @s run tp @s @p # 5. 调用反馈函数 function mypack:farm/feedback

第四步:反馈函数 (farm/feedback.mcfunction)

# farm/feedback.mcfunction # 简单统计本次收割的作物数量(通过计分板) execute store result score #total mypack.stats run data get entity @e[type=item,tag=!counted,nbt={Item:{id:"minecraft:melon_slice"}},limit=1] Item.Count tag @e[type=item,tag!counted] add counted # 向所有玩家发送标题消息 title @a actionbar [{"text":"农场收割完成!", "color":"green"}, {"text":" 收获西瓜片:", "color":"white"}, {"score":{"name":"#total","objective":"mypack.stats"}}]

5.3 整合与自动执行

  1. tick.json中注册检测函数(注意控制频率):
    { "values": [ "mypack:farm/check" ] }
  2. 在游戏内,手动运行一次初始化函数:
    /function mypack:farm/init
  3. 之后,系统便会自动每10秒检测并收割一次成熟作物,并通过标题栏反馈。

6. 常见问题与排查思路(FAQ)

在编写和运行函数时,你一定会遇到各种问题。下表列出了最常见的问题及其解决方法:

问题现象可能原因排查与解决思路
/function命令提示“未知的函数”1. 函数路径错误。
2. 数据包未正确加载。
3..mcfunction文件不在正确的functions文件夹内。
1. 检查命令格式:/function 命名空间:路径/函数名
2. 输入/datapack list确认你的数据包是否在“已启用”列表中。
3. 检查文件目录结构,确保文件在data/<命名空间>/functions/下。
函数执行后无任何效果1. 函数文件内有语法错误(如指令拼写错误)。
2. 指令的执行条件不满足(如选择器@p未找到玩家)。
3. 函数文件编码错误(如保存为UTF-8 with BOM)。
1. 逐行检查函数文件中的指令,尝试在聊天框手动输入单条指令测试。
2. 在指令前加say 测试来定位函数是否被执行到某一行。
3. 确保文本编辑器以UTF-8 无 BOM格式保存文件。
游戏卡顿或崩溃1.tick.json中的函数过于复杂或执行频率太高。
2. 函数中存在死循环(递归调用无终止条件)。
3. 函数操作了大量实体(如@e选择器未加限制)。
1. 优化tick函数逻辑,减少每刻执行量,或用schedule替代。
2.立即检查递归函数!必须存在如if score ... matches ..N的终止条件。
3. 为选择器增加范围、数量、类型限制,如@e[type=item,distance=..10,limit=20]
/reload后函数修改未生效1. 函数文件修改后未保存。
2. 数据包文件仍在被其他程序(如编辑器)占用。
3. 游戏客户端缓存问题。
1. 保存文件,并确保游戏有读取权限。
2. 关闭可能占用文件的文本编辑器。
3. 尝试完全退出世界再重新进入,或重启游戏。
指令在聊天框有效,在函数中无效1. 函数中的指令多了斜杠/
2. 执行上下文(执行者、执行位置)不同。
1.删除函数内指令行首的斜杠
2. 在函数中使用execute as @a at @s run ...来明确指定执行者和位置。
无法找到tick.jsonload.json文件路径或名称错误。确保文件路径为data/minecraft/tags/functions/tick.json,且文件名拼写完全正确。

7. 最佳实践与高级工程建议

当你开始制作更复杂的数据包时,遵循良好的实践习惯至关重要。

7.1 代码组织与命名规范

  • 模块化:将不同功能拆分成不同的函数文件。例如,player/init.mcfunction,player/advancement.mcfunction,world/weather.mcfunction
  • 清晰的命名空间:使用有意义的命名空间,如地图名称缩写mmd_(My Maze Dungeon),避免使用minecraft等保留字。
  • 函数命名:使用动词开头,表明其功能,如give_starting_items.mcfunction,check_quest_complete.mcfunction,spawn_boss.mcfunction
  • 使用子目录functions文件夹下可以创建子文件夹来分类管理,如systems/,quests/,npcs/

7.2 性能优化

  • 慎用tick.json:放入其中的函数会每刻执行(每秒20次)。确保其中的逻辑尽可能轻量。复杂的循环任务应使用schedule来降低频率。
  • 优化选择器@e@a是性能杀手。务必加上limit=,distance=..,type=等限制条件。例如,@e[type=item,distance=..32,limit=10]@e好得多。
  • 避免高频的区块加载与实体生成:在函数中频繁使用summonfill在远处生成实体/方块可能导致卡顿。
  • 利用记分板做计时器:相比红石时钟,用记分板在tick函数中做计数判断,性能开销更小。

7.3 可维护性与调试

  • 大量使用注释:用#解释复杂逻辑、参数含义和函数用途。
  • 建立调试函数:创建一个debug.mcfunction,其中包含saytitle或粒子效果命令,在关键流程处调用,以便跟踪执行状态。
  • 版本控制:如果你的项目较大,考虑使用 Git 等工具管理你的数据包文件夹。这能方便地回退到之前的稳定版本。
  • 备份原始数据:在对世界进行大规模修改(如fillclone)的函数前,先执行save holdsave query进行手动存档备份是一个好习惯。

7.4 发布与分享

  • 清理测试代码:发布前,移除或注释掉所有调试用的saytellraw命令。
  • 提供说明:在数据包根目录创建一个README.txt,说明功能、使用方法、依赖的游戏版本等。
  • 完整测试:在不同环境下(单人、局域网、租赁服)测试你的数据包,确保其行为一致。
  • 压缩为.zip:分享时,将整个数据包文件夹压缩成.zip文件。注意是压缩文件夹内容,而不是压缩文件夹本身。

通过这篇教程,你已经掌握了从零开始创建、编写到高级应用网易版《我的世界》函数指令的全套技能。从简单的问候到构建一个自动化农场系统,函数将你的指令能力从“手工操作”提升到了“编程自动化”的层面。记住,所有复杂的机器和玩法都是由一个个简单的函数模块组合而成的。接下来,你可以尝试用函数制作一个商店系统、一个自定义BOSS战、或者一套任务指引。多动手实践,多查阅官方Wiki(针对基岩版/教育版指令)或社区资源,你很快就能成为朋友眼中的“指令大神”。如果在实践中遇到具体问题,不妨将你的函数代码和问题现象在社区分享,通常能很快得到解答。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 16:47:02

短视频运营与合规实操指南:从版权自查到数据复盘

之前在业务迭代里帮朋友打理短视频账号时&#xff0c;经常看到一类困惑&#xff1a;视频明明花了很多心思剪辑&#xff0c;画面、节奏、配音都调到位了&#xff0c;标题里也写了“高质量作品”“求推荐”&#xff0c;结果播放量还是不高&#xff0c;甚至偶尔收到“内容不适合继…

作者头像 李华
网站建设 2026/9/2 16:44:53

Claude Code 2.0 提示词优化:从指令驱动到意图理解的高效编程协作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 16:43:37

AI帮你写代码的时候,顺手把53个后门包名也写进去了

开发者向模型询问, 帮其写一个REST API示例, 模型生成了一段看上去颇完整的代码, 有, 有pip rest -, 甚至还有注释对每个依赖的用途予以说明, 开发者进行复制粘贴, 于终端运行了一遍pip, 一切正常, 只是存在一个细节。rest-这个包名不存在。真实安装包是。假设这仅仅是一回运行…

作者头像 李华
网站建设 2026/9/2 16:42:55

基于 SSM 的网上宠物商店设计与实现(Spring+SpringMVC+MyBatis+MySQL)

基于 SSM 的网上宠物商店设计与实现&#xff08;SpringSpringMVCMyBatisMySQL&#xff09; 一、前言 养宠家庭逐年增多&#xff0c;宠物消费从「吃饱」走向「养好」&#xff0c;线上宠物商店也成了不少毕设选题和实体商家触网的第一步。一个能跑通的宠物商店系统&#xff0c;…

作者头像 李华
网站建设 2026/9/2 16:39:54

Java学习笔记十二(异常与IO)

1 异常1.1 异常种类(1) Error // 编码阶段提示&#xff0c;不修正则无法通过编译(2) Exception // 编码阶段不提示&#xff0c;运行时发现1.2 异常处理异常信息必须try catch捕获处理&#xff0c;或者throws向上抛出1.2.1 捕获异常注释&#xff1a;finally执行时会缓存try或ca…

作者头像 李华
网站建设 2026/9/2 16:38:22

Qt4.8触摸屏软键盘实现:点击输入框呼出与事件过滤器详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华