QtQuick调色板,用于禁用的小部件

时间:2019-06-19 12:39:26

标签: qt qt5 qtquick2 qtquickcontrols2 qqmlapplicationengine

我正在研究需要较深调色板的Qt(QML)应用程序。根据一些示例,我创建了一个qtquickcontrols2.conf文件,其内容如下:

[Controls]
Style=Fusion

[Fusion\Palette]
AlternateBase=#353535
Base=#191919
BrightText=red
Button=#353535
ButtonText=white
Highlight=#2a82da
HighlightedText=gray
Link=#2a82da
Text=white
ToolTipBase=white
ToolTipText=white
Window=#353535
WindowText=#dddddd

调色板在小部件的活动模式下正常工作。但是,禁用的小部件看起来与活动的小部件完全相同。我没有找到将禁用的小部件的颜色添加到配置文件的方法。看来这不可能完成。

然后我有了一个主意,可以在应用程序main中创建较浅版本的活动调色板。

QPalette& updateDisabledColors(QPalette &palette)
{
    palette.setColor(QPalette::Disabled, QPalette::Window, palette.window().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::WindowText, palette.windowText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Base, palette.base().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::AlternateBase, palette.alternateBase().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Text, palette.text().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Button, palette.button().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::ButtonText, palette.buttonText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::BrightText, palette.brightText().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Link, palette.link().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::Highlight, palette.highlight().color().lighter());
    palette.setColor(QPalette::Disabled, QPalette::HighlightedText, palette.highlightedText().color().lighter());

    return palette;
}


int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

// Tried to change palette here also

    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    auto palette = app.palette();
    palette = updateDisabledColors(palette);
    app.setPalette(palette);

    return app.exec();
}

app获取的调色板不是qtquickcontrol2.conf中定义的调色板。

使用QML时,为禁用的小部件修改调色板颜色的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

据我所知,在import { Component, OnInit, Input, ViewChild } from '@angular/core'; @Component({ selector: 'app-child', template: ` <input #input type="text" [(ngModel)]="info.one"/> <input type="text" [(ngModel)]="info.two"/>`, styleUrls: ['./child.component.css'] }) export class ChildComponent implements OnInit { @Input() info; @ViewChild('input', {static: true} ) input; constructor() { } ngOnInit() { this.input.nativeElement.select(); } } 中设置Fusion样式调色板不会更新默认的qtquickcontrols2.conf调色板。但是相反的工作-默认的Q[Gui]Application调色板是系统范围的默认Controls2,可以使用QPalette进行设置。因此,您可以像现在只为Q[Gui]Application::setPalette()组那样在C ++代码中设置所有颜色组。

查看relevant code,看起来您还可以在Disabled中指定Disabled子组(例如qtquickcontrols2.conf)。我不确定可以在哪个版本的Qt中使用它,也不确定在任何地方都可以看到此文档。

已添加:至少从Qt 5.10开始(这也是在引入Control::palette属性时),似乎从conf文件中读取了Fusion/Palette/Disabled和子组。