Css 设置QML的样式,而不手动标记要设置样式的每个属性

Css 设置QML的样式,而不手动标记要设置样式的每个属性,css,qt,qml,styling,Css,Qt,Qml,Styling,我知道QML不支持像小部件那样的CSS样式,我已经阅读了样式化/主题化的替代方法: 这些方法的共同点是,它们要求开发人员通过绑定到“样式化QML文件/单例”中的属性,或者通过使用加载程序根据样式名称加载不同的QML组件,来指定可以设置样式的QML部分。我想要的是像CSS中的“id”选择器而不是“class”选择器一样工作的东西,这样单个QML文件就不必知道它们以后是否会被样式化 我当前的方法使所有QML文件看起来与此类似(使用链接2中的方法): Main.qml Rectangle {

我知道QML不支持像小部件那样的CSS样式,我已经阅读了样式化/主题化的替代方法:

这些方法的共同点是,它们要求开发人员通过绑定到“样式化QML文件/单例”中的属性,或者通过使用加载程序根据样式名称加载不同的QML组件,来指定可以设置样式的QML部分。我想要的是像CSS中的“id”选择器而不是“class”选择器一样工作的东西,这样单个QML文件就不必知道它们以后是否会被样式化

我当前的方法使所有QML文件看起来与此类似(使用链接2中的方法):

Main.qml

Rectangle {
    Id: background
    color: g_theme.background.color 
    //g_theme is defined in root context and loaded dynamically
}
Rectangle {
    Id: background
    color: “green” // default color
}
我想做的是:

Main.qml

Rectangle {
    Id: background
    color: g_theme.background.color 
    //g_theme is defined in root context and loaded dynamically
}
Rectangle {
    Id: background
    color: “green” // default color
}
然后创建一个样式文件,用于定义(或类似)


这在目前是可能的,还是未来的Qt版本正在酝酿中,或者首选的样式化方法将继续类似于上面链接中描述的方法?

首选的方法不是在默认组件上应用样式,但是从这些组件派生来创建预先样式化的自定义组件

我为我的项目所做的:

首先,我创建一个集中的“主题”文件,作为JavaScript共享模块:

// MyTheme.js
.pragma library;
var bgColor   = "steelblue";
var fgColor   = "darkred";
var lineSize  = 2;
var roundness = 6;
接下来,我创建依赖它的自定义组件:

// MyRoundedRect.qml
import QtQuick 2.0;
import "MyTheme.js" as Theme;
Rectangle {
    color: Theme.bgColor;
    border {
        width: Theme.lineSize;
        color: Theme.fgColor;
    }
    radius: Theme.roundness;
}
然后,我可以在任何地方使用预先设计好的组件,只需一行代码:

MyRoundedRect { }
这种方法有一个巨大的优势:它是真正面向对象的,而不是简单的蒙皮

如果需要,甚至可以在自定义组件中添加嵌套对象,如文本、图像、阴影等。。。甚至一些UI逻辑,比如鼠标悬停时的颜色变化


PS:是的,可以使用QML单例而不是JS模块,但它需要额外的
qmldir
文件,并且仅在Qt5.2中受支持,这可能是有限的。显然,上下文属性中的C++ QObjor也会起作用(例如,如果你想从磁盘上的文件加载皮肤属性),

,也可以帮助查看

使用控件样式时,无需显式指定目标控件中的每个属性。所有属性都可以在单独的
[ControlName]样式中定义
组件(例如
ButtonStyle
)。
然后在目标组件(例如,
按钮
)中,您可以在一行代码中引用样式组件


这里唯一的缺点是样式组件仅可用于Qt快速控件。不适用于任何Qt组件。

谢谢您的回答-我想您的方法与我们目前的做法类似,只是我们使用qml文件来定义“主题”,而不是.js文件。我的问题是,我们必须尽早决定我们想要的样式,以避免需要经历大量的主题和控件,并修改我们想要应用样式的属性。但现在它工作正常,所以我们将继续使用这种方法,直到更好的东西出现语句?我想完全像@jesperhh那样做,但是使用外部二进制资源。我想知道我是否可以在运行时更改主题而不必声明导入。