2018年4月6日金曜日

Trolltech Colors

Qt の有名な 2 色を使ってみます。
Trolltech Green RGB(141, 192, 48) [CMYK 40/0/100/0]
Trolltech Purple RGB(131, 124, 172) [CMYK 39/39/0/0]
QML での実装です。
trolltechcolors.qml:

import QtQuick 2.10
import QtQuick.Window 2.10
import QtQuick.Layouts 1.3

Window {
    id: window

    visible: true

    readonly property color trolltechGreen: Qt.rgba(141/255, 192/255, 48/255)
    readonly property color trolltechPurple: Qt.rgba(131/255, 124/255, 172/255)

    minimumWidth: topLayout.implicitWidth
    minimumHeight: topLayout.implicitHeight

    ColumnLayout {
        id: topLayout

        anchors.fill: parent
        spacing: 0

        Repeater {
            id: trolltechColors

            model: [ { "name": "Trolltech Green", "color": trolltechGreen },
                     { "name": "Trolltech Purple", "color": trolltechPurple } ]

            Rectangle {
                width: 2*fontMetrics.boundingRect(name.text).width
                height: 3*fontMetrics.height
                Layout.fillWidth: true
                Layout.fillHeight: true

                color: modelData.color

                Text {
                    id: name

                    anchors.centerIn: parent

                    text: modelData.name
                    color: "white"

                    FontMetrics {
                        id: fontMetrics

                        font: name.font
                    }
                }
            }
        }
    }
}
FontMetrics は Text の子オブジェクトですが Item を継承していないので parent プロパティーはありません。従って、Text の font を参照するには id 修飾が必要です。

C++ での実装です。
main.cpp:

#include <QApplication>
#include <QLabel>
#include <QPalette>
#include <QFontMetricsF>
#include <QLayout>

class TrolltechColors : public QWidget
{
    Q_OBJECT

public:
    TrolltechColors();

private:
    QLabel* makeColorLabel(const QString& text, const QColor& color) const;
};

TrolltechColors::TrolltechColors()
    : QWidget(0)
{
    const auto topLayout = new QVBoxLayout(this);
    topLayout->setMargin(0);
    topLayout->setSpacing(0);
    topLayout->addWidget(makeColorLabel("Trolltech Green", QColor(141, 192, 48)));
    topLayout->addWidget(makeColorLabel("Trolltech Purple", QColor(131, 124, 172)));
}

QLabel* TrolltechColors::makeColorLabel(const QString& text, const QColor& color) const
{
    const auto label = new QLabel(text);
    label->setAutoFillBackground(true);

    QPalette labelPalette = label->palette();
    labelPalette.setColor(QPalette::Window, color);
    labelPalette.setColor(QPalette::WindowText, "White");
    label->setPalette(labelPalette);

    const QFontMetricsF fontMetricsF(label->font());

    label->setMinimumWidth(2*fontMetricsF.width(label->text()));
    label->setMinimumHeight(3*fontMetricsF.height());

    label->setAlignment(Qt::AlignCenter);

    return label;
}

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    TrolltechColors trolltechColors;
    trolltechColors.show();

    app.exec();
}

#include "main.moc"
QLabel::fontMetrics() は QFontMetrics を返すので QML が使っている QFontMetricsF よりも幅や高さが大きくなります。そこで QFontMetricsF を使って同じサイズになるようにしています。

実行結果は左から順に QML で renderType にデフォルトの Text.QtRendering と Text.NativeRendering、QLabel で QFontMetricsF と QLabel::fontMetrics() です。QML の Text.NativeRendering は QLable と同じようにテキスト描画されます。QML の Text.QtRendering ではこれらと違いテキストが細くなっています。しかし、FontMetrics で求めるサイズは renderType に依存しません。

QML
renderType: Text.QtRendering
QML
renderType: Text.NativeRendering
QLabel
QFontMetricsF
QLabel
fontMetrics()

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。