8.Draw

本例实现2个功能:1)画多条线   2)自定义按钮

 

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>

class MyButton : public QWidget
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = 0);
    MyButton(const QString& text, QWidget* parent = 0);

    QRect _rect;
    QString _text;
    bool _pressed;
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);

    void paintEvent(QPaintEvent *);

signals:
    void clicked();

public slots:

};

#endif // MYBUTTON_H
#include "MyButton.h"
#include <QPainter>
#include <QMouseEvent>
MyButton::MyButton(QWidget *parent) :
    QWidget(parent), _rect(0, 0, 100, 30), _text(QString())
{
    _pressed = false;
    this->setGeometry(_rect);
}

MyButton::MyButton(const QString &text, QWidget *parent):
    QWidget(parent), _text(text), _rect(0, 0, 100, 30)
{
    _pressed = false;
    this->setGeometry(_rect);
}

void MyButton::mousePressEvent(QMouseEvent *)
{
    _pressed = true;
    update();
}

void MyButton::mouseReleaseEvent(QMouseEvent *ev)
{
    _pressed = false;
    update();

    if(_rect.contains(ev->pos()))
        emit clicked();
    // callback handler
}
void MyButton::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    if(_pressed)
        p.setBrush(Qt::yellow);
    else
        p.setBrush(Qt::darkGray);
    p.drawRect(_rect);
    p.drawText(_rect, _text, QTextOption(Qt::AlignCenter));
}
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include "MyButton.h"

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    MyButton* button;

    void paintEvent(QPaintEvent *);

    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);

    QVector< QVector<QPoint> > _lines;

signals:

public slots:
    void slotButtonClicked();
};

#endif // MYWIDGET_H

 

#include "MyWidget.h"
#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
#include <QDebug>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    button = new MyButton("MyButton", this);
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));

    button->setGeometry(30, 30, 100, 30);
}

void MyWidget::slotButtonClicked()
{
    qDebug() << "button is clicked";
}

void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    for(int i=0; i<_lines.size(); ++i)
    {
        const QVector<QPoint>& line = _lines.at(i);
        for(int j=0; j<line.size()-1; ++j)
        {
            p.drawLine(line.at(j), line.at(j+1));
        }
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent *ev)
{
    if(_lines.size() == 0)
    {
        QVector<QPoint> line;
        _lines.append(line);
    }

    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());

    update();
}
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
    QVector<QPoint> line;
    _lines.append(line);

    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}
void MyWidget::mouseReleaseEvent(QMouseEvent *ev)
{
    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}

#include <QApplication>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    return app.exec();
}

 

<think>好的,我现在需要帮助用户查找关于u8g2库中drawBitmap函数的用法或示例。首先,我应该回顾用户提供的引用内容,看看是否有直接相关的信息。 用户提供的引用中有提到drawXBitmap,引用[1]提到需要使用pgm_read_byte方法来读取PROGMEM区的数据,这可能和drawBitmap有关联,但不确定具体区别。引用[3]中提到了u8g2的初始化和页面循环结构,这可能是使用任何绘图函数的基础步骤。引用[4]是关于设置对比度的自定义方法,可能不直接相关,但可以忽略。 接下来,我需要回忆u8g2库的常见函数。drawBitmap通常用于显示位图,而drawXBitmap可能用于特殊格式的位图。根据引用[1],drawXBitmap需要处理PROGMEM数据,可能drawBitmap也有类似要求,但需要确认参数类型和内存位置。 用户可能需要知道如何正确传递位图数据,可能涉及将图像转换为位图数组。引用[2]提到了将图片放入特定目录并使用工具转换,这可能涉及使用png2bdf工具生成位图数据,但用户问的是drawBitmap,可能需要其他工具如Image2Lcd或在线转换器。 然后,我应该构建一个示例代码,包含初始化和绘制流程,基于引用[3]的页面循环结构。需要指出位图数据应存储在特定内存区域,并使用正确的读取方法,如pgm_read_byte。此外,可能需要注意颜色模式,比如单色位图使用1表示前景色。 最后,生成相关问题,帮助用户深入理解,比如不同绘图函数的区别、优化显示性能的方法以及处理大位图的技巧。</think>关于u8g2库中$drawBitmap$函数的用法,以下是关键要点和示例说明: ### 基础用法说明 1. **函数原型**: $$void drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h, const uint8_t *bitmap)$$ 2. **参数解析**: - $x,y$: 绘制起点坐标 - $cnt$: 位图横向字节数(宽度 × 每像素位数 ÷ 8) - $h$: 位图高度像素数 - $bitmap$: 存储像素数据的数组 ### 示例代码 ```cpp // 定义位图数据(8x8像素) static const uint8_t bitmap_data[] U8X8_PROGMEM = { 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF }; void setup() { u8g2.begin(); u8g2.firstPage(); do { u8g2.drawBitmap(10, 20, 1, 8, bitmap_data); // 绘制1字节宽、8像素高的图形 u8g2.drawFrame(8,18,12,10); // 添加边框[^3] } while(u8g2.nextPage()); } ``` ### 注意要点 1. **内存处理**:建议使用$U8X8_PROGMEM$将位图数据存储在Flash中,避免占用过多RAM[^1] 2. **颜色模式**:每个bit对应1个像素(0=背景色,1=前景色) 3. **尺寸计算**:宽度计算需注意$\text{cnt} = \lceil \text{width}/8 \rceil$,如16像素宽需2字节 ### 进阶技巧 - 可使用工具如**Image2Lcd**或在线转换器生成位图数组 - 大尺寸位图建议分块绘制提升性能 - 结合$setDrawColor$实现反色显示效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值