按照教程,写一个QIconEditor类,增加了ctrl + 鼠标中间滑轮调整zoom。代码如下。

package jqt;

import io.qt.core.*;
import io.qt.gui.*;
import io.qt.widgets.QSizePolicy;
import io.qt.widgets.QWidget;

public class QIconEditor extends QWidget{
    public QIconEditor() {
        this(null);
    }
    public QIconEditor(QWidget parent) {
        super(parent);
        setAttribute(Qt.WidgetAttribute.WA_StaticContents);
        setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum);
        penColor = new QColor(Qt.GlobalColor.black);
        zoom = 8;
        image = new QImage(16,16, QImage.Format.Format_ARGB32);
        image.fill(QColor.fromRgb(0,0,0,0));
    }
    public QSize sizeHint(){
        QSize size = zoom * image.size();
        if (zoom >= 3)
            size += new QSize(1, 1);
        return size;
    }
    public void setPenColor(QColor color){
        penColor = color;
    }
    public QColor getPenColor(){
        return penColor;
    }
    public void setImage(QImage newImage){
        if (newImage != image){
            image = newImage.convertToFormat(QImage.Format.Format_ARGB32);
            update();
            updateGeometry();
        }
    }
    public QImage getImage(){
        return image;
    }
    public void setZoom(int newZoom){
        if (newZoom < 1)
            newZoom = 1;
        if (newZoom != zoom){
            zoom = newZoom;
            update();
            updateGeometry();
        }
    }
    public int getZoom(){
        return zoom;
    }
    @Override
    protected void mousePressEvent(QMouseEvent e) {
        if (e.button() == Qt.MouseButton.LeftButton) {
            setImagePixel(e.pos(), true);
        } else if (e.button() == Qt.MouseButton.RightButton) {
            setImagePixel(e.pos(), false);
        }
    }
    @Override
    protected void mouseMoveEvent(QMouseEvent e) {
        if (e.buttons().testFlags(Qt.MouseButton.LeftButton)) {
            setImagePixel(e.pos(), true);
        } else if (e.buttons().testFlags(Qt.MouseButton.RightButton)) {
            setImagePixel(e.pos(), false);
        }
    }
    @Override
    protected void wheelEvent(QWheelEvent e) {
        boolean controlKey = QGuiApplication.keyboardModifiers().testFlags(Qt.KeyboardModifier.ControlModifier);
        if (e.angleDelta().y() > 0 && controlKey)
            zoom++;
        else if (e.angleDelta().y() < 0 && controlKey)
            zoom--;
    }
    @Override
    protected void paintEvent(QPaintEvent e) {
        QPainter painter = new QPainter(this);
        if (zoom >= 3) {
            painter.setPen(palette().color(QPalette.ColorRole.WindowText));
            for (int i = 0; i <= image.width(); i++)
                painter.drawLine(zoom * i, 0,
                        zoom * i, zoom * image.height());
            for (int j = 0; j <= image.height(); j++)
                painter.drawLine(0, zoom * j,
                        zoom * image.width(), zoom * j);
        }

        for (int i = 0; i < image.width(); i++) {
            for (int j = 0; j < image.height(); j++) {
                QRect rect = pixelRect(i, j);
                if (e.region().intersects(rect)) {
                    QColor color = QColor.fromRgba(image.pixel(i, j));
                    if (color.alpha() < 255)
                        painter.fillRect(rect, Qt.GlobalColor.white);
                    painter.fillRect(rect, color);
                }
            }
        }
        painter.end();
    }

    private void setImagePixel(QPoint pos, boolean opaque){
        int i = pos.x() / zoom;
        int j = pos.y() / zoom;

        if (image.rect().contains(i, j)) {
            if (opaque) {
                image.setPixel(i, j, penColor.rgba());
            } else {
                image.setPixel(i, j, QColor.fromRgb(0, 0, 0, 0).rgba());
            }

            update(pixelRect(i, j));
        }
    }
    private QRect pixelRect(int i, int j){
        if (zoom >= 3) {
            return new QRect(zoom * i + 1, zoom * j + 1, zoom - 1, zoom - 1);
        } else {
            return new QRect(zoom * i, zoom * j, zoom, zoom);
        }
    }
}

调用如下

package one;

import io.qt.gui.QImage;
import jqt.Jqt;
import jqt.QIconEditor;

public class Main{
    public static void main(String[] args){
        Jqt qt = new Jqt(args, null);
        QIconEditor editor = new QIconEditor();
        editor.setImage(new QImage(":/test/mouse.png"));
        editor.show();
        qt.run();
    }
}

结果如下

 

posted on 2025-04-05 11:09  dalgleish  阅读(13)  评论(0)    收藏  举报