在上一遍文章介绍加载字体库来实现LCD显示数字,本篇介绍使用源码来实现,动手自己写源码。在UI下QLCDNumber控件实现了LCD数字显示,观看该控件的源码,实现自己的LCD数字显示。
首先定义一个类,例如“LCDNumberItem”继承QQuickPaintedItem类。h文件如下所示:主要是仿照QLCDNumber控件
#ifndef LCDNUMBERITEM_H
#define LCDNUMBERITEM_H
#include <QtQuick/QQuickPaintedItem>#include <QBitArray>class LCDNumberItem : public QQuickPaintedItem{Q_OBJECTQ_PROPERTY(bool smallDecimalPoint READ smallDecimalPoint WRITE setSmallDecimalPoint)Q_PROPERTY(int digitCount READ digitCount WRITE setDigitCount)Q_PROPERTY(Mode mode READ mode WRITE setMode)Q_PROPERTY(SegmentStyle segmentStyle READ segmentStyle WRITE setSegmentStyle)Q_PROPERTY(double value READ value WRITE display)Q_PROPERTY(int intValue READ intValue WRITE display)public:
LCDNumberItem(QQuickItem *parent = 0);~LCDNumberItem();enum Mode {Hex, Dec, Oct, Bin};
Q_ENUM(Mode)enum SegmentStyle {Outline , Filled, Flat};
Q_ENUM(SegmentStyle)bool smallDecimalPoint() const;int digitCount() const;void setDigitCount(int nDigits);bool checkOverflow(double num) const;bool checkOverflow(int num) const;Mode mode() const;void setMode(Mode);SegmentStyle segmentStyle() const;void setSegmentStyle(SegmentStyle);double value() const;int intValue() const;void paint(QPainter *painter);public Q_SLOTS:void display(const QString &str);void display(int num);void display(double num);void setHexMode();void setDecMode();void setOctMode();void setBinMode();void setSmallDecimalPoint(bool);signals:
void overflow();public slots:private:
void init();void internalSetString(const QString& s);void drawString(const QString& s, QPainter &, QBitArray * = 0, bool = true);void drawDigit(const QPoint &, QPainter &, int, char, char = ' ');void drawSegment(const QPoint &, char, QPainter &, int, bool = false);private:
int ndigits;double val;uint base : 2;uint smallPoint : 1;uint fill : 1;uint shadow : 1;QString digitStr;QBitArray points;};#endif // LCDNUMBERITEM_H实现文件基本和QLCDNumber控件差不多,本人还在完善中,争取实现更换颜色。在使用之前要注册一下:
qmlRegisterType<LCDNumberItem>("LCDNumberItem", 1, 0, "LCDNumberItem");
初步显示效果如下: