QML 电池案例实践笔记

QML 电池案例实践笔记

  • 工程文件中添加

  • 文件目录结构

  • EleCell.h
#ifndef ELECELL_H
#define ELECELL_H

#include <QQuickPaintedItem>

class EleCell : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(quint32 electric READ getElectric  WRITE  setElectric NOTIFY electricChanged)
    Q_PROPERTY(QColor  color READ getColor  WRITE  setColor NOTIFY colorChanged)
    Q_PROPERTY(quint32 threshold READ  getThreshold WRITE setThreshold NOTIFY thresholdChanged)

public:
    using QQuickPaintedItem::QQuickPaintedItem;

    //重写绘制
    void paint(QPainter*) override;

    //设置电量
    void setElectric( quint32 value) noexcept;
    quint32  getElectric()const noexcept;

    //设置颜色
    void setColor(QColor value)noexcept;
    QColor  getColor()const noexcept;

    //设置阈值
    void setThreshold(quint32 value) noexcept;
    quint32  getThreshold()const noexcept;

signals:
    void electricChanged();
    void colorChanged();
    void thresholdChanged();

private:
    quint32 m_iLineWidth = 1;
    quint32 m_iElectric = 70;
    QColor  m_qColor = Qt::green;
    QColor  m_qWarningColor = Qt::red;
    quint32 m_iThreshold = 20;

};

#endif // ELECELL_H
  • EleCell.cpp
#include "EleCell.h"
#include <QPainter>
#include <QPen>
#include <QBrush>

void EleCell::paint(QPainter *painter)
{
    QPen pen;
    pen.setColor(Qt::darkRed);
    pen.setWidth(m_iLineWidth);
    painter->setPen(pen);

    //电池头部
    quint32 headWidth = width() * 0.1;
    quint32 headHeight = height() * 0.3;

    auto cellWidth  = width() - pen.width() -headWidth;
    auto cellHeight = height() - pen.width();

    //电池
    painter->drawRect(0, 0, cellWidth, cellHeight);

    auto electricWidth = (cellWidth - pen.width())*m_iElectric / 100;
    auto electricHeight = cellHeight - pen.width();
    painter->fillRect(pen.width(), pen.width(), electricWidth, electricHeight, \
                      m_iElectric > m_iThreshold ? m_qColor : m_qWarningColor);

    //电池头部填充
    auto headX = cellWidth + pen.width();
    auto headY = height() / 2 -  headHeight/ 2;
    painter->fillRect(headX, headY, headWidth, headHeight, Qt::black);

}

void EleCell::setElectric(quint32 value) noexcept
{
    if(value < 0 || value > 100)
    {
        return;
    }

    m_iElectric = value;
    emit electricChanged();
    update();
}

quint32 EleCell::getElectric() const noexcept
{
    return m_iElectric;
}

void EleCell::setColor(QColor value) noexcept
{
    m_qColor = value;
    emit colorChanged();
}

QColor EleCell::getColor() const noexcept
{
    return m_qColor;
}

void EleCell::setThreshold(quint32 value) noexcept
{
    if(value < 0 || value > 100)
    {
        return;
    }

    m_iThreshold = value;
    emit thresholdChanged();
    update();
}

quint32 EleCell::getThreshold() const noexcept
{
    return m_iThreshold;
}
  • main.cpp
#include "EleCell.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include <QQuickStyle>

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    //设置主题样式
    QQuickStyle::setStyle("Material");

    //注册自定义C++类型、
    qmlRegisterType<EleCell>("com.mycompany.elecell", 1, 0, "EleCell");

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}
  • main.qml
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.5
import com.mycompany.elecell 1.0

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Column{
        id: col
        spacing: 30
        anchors.fill: parent
        //自定义控件
        EleCell{
            id:cell
            anchors.horizontalCenter: parent.horizontalCenter
            width:200
            height:80
            electric:slider.value
            color:"green"
            threshold:30
        }

        Slider{
            id:slider
            anchors.horizontalCenter: parent.horizontalCenter
            from:0
            value:25
            to:100
        }
    }
}

 

### 回答1: QML是一种用于创建用户界面的编程语言,我们可以使用QML来设计一个电池剩余电量的显示界面。 首先,我们需要创建一个矩形框来表示电池的外观。可以使用Rectangle元素,并设置不同的颜色来表示不同的电量状态。例如,可以将矩形框的颜色分为红色、橙色和绿色,分别表示低电量、中等电量和高电量。 接下来,我们可以在矩形框的内部绘制一个表示电池剩余电量的条形。可以使用Rectangle元素,并根据电量的百分比设置条形的宽度。可以进一步通过设置不同的颜色,例如绿色、黄色和红色,根据电量的不同来显示剩余电量的程度。 此外,我们还可以添加一些文本元素来显示电量的百分比数值和描述文字。可以使用Text元素,并根据电量的百分比进行动态更新。可以设置不同的字体、颜色和对齐方式,来美化界面并提供更好的用户体验。 最后,为了实时显示电量的变化,可以使用Qt的信号和槽机制来监测电池电量的变化,并在变化时更新界面的显示。 通过以上的方法,我们可以使用QML创建一个简单而直观的电池剩余电量显示界面。它可以更好地提供用户对电池剩余电量的了解,以便及时采取相应措施,确保电池的正常使用。 ### 回答2: QML是一种用于创建用户界面的语言,我们可以使用QML来设计和实现一个电池剩余电量显示界面。 首先,我们需要在QML界面中创建一个矩形图形作为电池外框,并设置其大小和颜色。接下来,我们可以使用一个垂直布局来放置电池内部的电量显示和背景。 在电池内部,我们可以使用一个水平布局来放置电量矩形和电量百分比标签。电量矩形可以通过设置其宽度和颜色来表示电池的剩余电量。通过绑定电量百分比标签的文本属性与电池剩余电量,我们可以实时显示电池电量的百分比。 为了使界面更加美观和友好,我们还可以根据电池电量的不同程度,设置一些动画效果,例如,当电池电量低于20%时,可以通过闪烁或改变颜色的方式来吸引用户的注意。 此外,在界面的其他位置,我们还可以添加一些附加功能,例如,提供充电状态显示、剩余时间估算等信息。 总之,使用QML可以很方便地创建一个电池剩余电量显示界面。通过设置适当的布局、颜色和动画效果,我们可以使界面更加直观和友好,从而满足用户对电池电量显示的需求。 ### 回答3: QML是一种用于设计用户界面的标记语言,它可以用来创建各种图形界面组件。在设计电池剩余电量显示界面时,我们可以利用QML的强大功能来实现一个简洁而直观的界面。 首先,在QML中,我们可以使用Rectangle组件来创建一个显示电池电量的框体,通过设置颜色、尺寸和位置来定制其外观。接着,我们可以使用Text组件来显示当前电池电量的百分比,通过设置字体大小、颜色和位置来使其易于阅读。 为了实现实时更新电池电量的功能,我们可以利用Javascript和QML的信号和槽机制。我们可以使用BatteryInfo类获取当前电池电量的信息,并将其传递给QML界面进行显示。可以通过定期调用电池信息获取函数,来保持电量显示的实时性。 此外,我们还可以使用动画效果来提升用户体验。可以通过添加属性动画,使电池电量显示的变化更加平滑和自然。例如,可以将电量变化的动画效果应用于Text组件,使其在电量改变时产生渐变的效果。 最后,为了增加用户的交互性,我们可以添加按钮或滑块来实现一些操作,例如开启或关闭省电模式,调整亮度或音量等。通过处理按钮或滑块的点击和滑动事件,我们可以连同电池电量信息一起进行相应的操作和显示。 总而言之,通过使用QML,我们可以设计一个直观、易于操作并具有动态效果的电池剩余电量显示界面。这样的界面将使用户能够方便地了解当前电池电量,并且能够进行相关的操作和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值