按照教程,写一个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(); } }
结果如下

浙公网安备 33010602011771号