乐趣区

关于qt:qt程序使用less编译less文件为qss文件

在 qt 应用程序里应用 qrc 里的 style.qss 文件, 并且在程序编译的时候将 style.less 事后编译成 style.qss,提供应用程序应用。

前提条件: 装置 node.js, 而后全局装置 less

办法 1

在 projects 里增加 build steps, 执行命令行即可, 有多少个 less 文件就增加多少次

办法 2

在.pro 文件里利用 qmake 进行预编译, 编译机会为:build-link

假如你的我的项目里应用了 qrc 的 style.qss 文件, 那么它会应用 rcc.exe 进行编译

1. 应用 QMAKE_PRE_LINK 和 QMAKE_POST_LINK
无奈实时生成,因为这两者的生命周期是在 link 前后, 而 rcc.exe 是在 build 期, 不合乎预期

2. 应用 system
system 生命周期优于 build 期, 然而当.pro 文件变动后,system 执行 lessc 命令, 然而如果只是批改了.less 文件, 它不会主动执行, 不合乎预期

3. 应用 PRE_TARGETDEPS,QMAKE_EXTRA_TARGETS
它两的生命周期优于 build 期, 合乎预期, 然而它是非阻塞式的, 与 build 是并发执行的,rcc.exe 拿到的还是旧的 style.css,不合乎预期

4. 应用 QMAKE_EXTRA_COMPILERS
根本用法

test.output = 文件 1.qss
test.commands = lessc 文件 1.less 文件 1.qss & lessc 文件 2.less 文件 2.qss ...
testInput = 文件 1.less
test.input = testInput
test.CONFIG = no_link

留神:
1.test.input 必须应用变量, 且不容许加 $ $, 写成 test.input = 文件 1.less 或者 test.input=$$testInput 都是无奈解析的

2.test.config 必须写成 no_link, 否则是会报错的

封装之后为:

# 扭转文件后缀名
defineReplace(changeFileSubFix){file = $$formatSlash($$1)
    subfix = $$2
    dir = $$dirname(file)
    baseName = $$basename(file)
    baseNameList =$$split(baseName,.)
    fileName = $$first(baseNameList)
    targetFile = $$join(fileName,,$$dir\,$$subfix)
    return ($$targetFile)
}
#less 命令, 负责将配置的.less 文件转换为.qss 文件
defineReplace(compileLessCommand){files = $$formatSlash($$1)
    firstFile = $$first(files)

    input = $$firstFile
    output = $$changeFileSubFix($$firstFile,".qss")
    commands =

    for(file,files){targetFile = $$changeFileSubFix($$file,".qss")
        commands += $$quote(lessc $$file $$targetFile &)
    }
    return ($$input $$commands $$output) #qmake 不反对数据, 数组嵌套语法
}

应用

# 定义款式文件
lessFiles += $$PWD/assets/style.less
lessFiles += $$PWD/assets/style1.less
lessFiles += ...

#编译款式文件
styleLessResult = $$compileLessCommand($$lessFiles)
styleLessInput = $$take_first(styleLessResult)
styleLess.input = styleLessInput
styleLess.output = $$take_last(styleLessResult)
styleLess.commands = $$styleLessResult
styleLess.CONFIG = no_link
QMAKE_EXTRA_COMPILERS += styleLess

生成的 makefile 文件:

compiler_styleLess_make_all: ..\..\..\ui\ui\assets\style.qss
compiler_styleLess_clean:
    -$(DEL_FILE) ..\..\..\ui\ui\assets\style.qss
..\..\..\ui\ui\assets\style.qss: ..\..\..\ui\ui\assets\style.less
    lessc C:\UserData\xxx\xxx\xxx\ui\ui\assets\style.less C:\UserData\xxx\xxx\xxx\ui\ui\assets\style.qss & lessc C:\UserData\xxx\xxx\xxx\ui\ui\assets\style1.less C:\UserData\xxx\xxx\xxx\ui\ui\assets\style1.qss &
退出移动版