Qt逐个像素地缩放

时间:2014-04-10 06:52:04

标签: c++ qt draw pixel

我试图在互联网上找到一些帮助,我有一些代码要测试,但没有一个像我想要的那样。

我会用Qt逐像素绘制。

我尝试在QImageQLabel使用受保护的事件mousePressEvent,但像素太小而无法看到它们。

我试图缩放我的图像,它更好,但是位置X,Y现在与像素的位置不同,或者它们与像素位置不同步。

这里有我想做的截图,如果有人有想法重新创建这个......

enter image description here

如果我可以通过Qt完全做到这一点,我将节省大量时间,只是逐个像素的基本绘图,我用油漆,黑白格式创建了这个例子,缩放到800%。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个针对特定大小进行硬编码的解决方案 - 只需实现像素图和绘制小部件之间的相对坐标映射,就可以了。

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0) : QWidget(parent), pressed(0) {
        color = Qt::black;
        pixmap = new QPixmap("h:/small.png");
        resize(240, 240);
    }
    ~Widget() { if (pixmap) delete pixmap; }

protected:
    void paintEvent(QPaintEvent *) {
        QPainter painter(this);
        painter.drawPixmap(0, 0, pixmap->scaled(240, 240));
        painter.drawPixmap(0, 0, *pixmap);
    }

    void mousePressEvent(QMouseEvent *e) {
        if (e->button() == Qt::RightButton)
            color = color == Qt::black ? Qt::white : Qt::black;
        else {
            pressed = 1;
            draw(e);
        }
    }

    void mouseReleaseEvent(QMouseEvent *) { pressed = 0; }
    void mouseMoveEvent(QMouseEvent *e) { draw(e); }

private:
    void draw(QMouseEvent *e) {
        if (pressed) {
            QPainter painter(pixmap);
            painter.setPen(color);
            int x = e->pos().x() / 12;
            int y = e->pos().y() / 12;
            painter.drawPoint(x, y);
            repaint();
        }
    }

    QColor color;
    QPixmap *pixmap;
    bool pressed;
};