qtgradientstopswidget.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 884 行 · 第 1/2 页
CPP
884 行
viewport()->update();}void QtGradientStopsWidget::mouseReleaseEvent(QMouseEvent *e){ if (!d_ptr->m_model) return; if (e->button() != Qt::LeftButton) return; d_ptr->m_dragging = false; d_ptr->m_rubber->hide(); d_ptr->m_dragStops.clear(); d_ptr->m_dragOriginal.clear();}void QtGradientStopsWidget::mouseMoveEvent(QMouseEvent *e){ if (!d_ptr->m_model) return; if (!(e->buttons() & Qt::LeftButton)) return; if (!d_ptr->m_dragging) return; if (!d_ptr->m_dragStops.isEmpty()) { double maxOffset = 0.0; double minOffset = 0.0; bool first = true; QMap<QtGradientStop *, qreal>::ConstIterator itStop = d_ptr->m_dragStops.constBegin(); while (itStop != d_ptr->m_dragStops.constEnd()) { double offset = itStop.value(); if (first) { maxOffset = offset; minOffset = offset; first = false; } else { if (maxOffset < offset) maxOffset = offset; else if (minOffset > offset) minOffset = offset; } itStop++; } double viewportMin = d_ptr->toViewport(-minOffset); double viewportMax = d_ptr->toViewport(1.0 - maxOffset); QMap<qreal, QtGradientStop *> newPositions; int viewportX = e->pos().x() - d_ptr->m_dragOffset; if (viewportX > viewport()->size().width()) viewportX = viewport()->size().width(); else if (viewportX < 0) viewportX = 0; double posX = d_ptr->fromViewport(viewportX); if (viewportX > viewportMax) posX = 1.0 - maxOffset; else if (viewportX < viewportMin) posX = -minOffset; itStop = d_ptr->m_dragStops.constBegin(); while (itStop != d_ptr->m_dragStops.constEnd()) { QtGradientStop *stop = itStop.key(); newPositions[posX + itStop.value()] = stop; itStop++; } bool forward = true; QMap<qreal, QtGradientStop *>::ConstIterator itNewPos = newPositions.constBegin(); if (itNewPos.value()->position() < itNewPos.key()) forward = false; itNewPos = forward ? newPositions.constBegin() : newPositions.constEnd(); while (itNewPos != (forward ? newPositions.constEnd() : newPositions.constBegin())) { if (!forward) itNewPos--; QtGradientStop *stop = itNewPos.value(); double newPos = itNewPos.key(); if (newPos > 1) newPos = 1; else if (newPos < 0) newPos = 0; QtGradientStop *existingStop = d_ptr->m_model->at(newPos); if (existingStop && !d_ptr->m_dragStops.contains(existingStop)) d_ptr->m_model->removeStop(existingStop); d_ptr->m_model->moveStop(stop, newPos); if (forward) itNewPos++; } QMap<qreal, QColor>::ConstIterator itOld = d_ptr->m_dragOriginal.constBegin(); while (itOld != d_ptr->m_dragOriginal.constEnd()) { double position = itOld.key(); if (!d_ptr->m_model->at(position)) d_ptr->m_model->addStop(position, itOld.value()); itOld++; } } else { QRect r(QRect(d_ptr->m_clickPos, e->pos()).normalized()); r.translate(1, 0); d_ptr->m_rubber->setGeometry(r); //d_ptr->m_model->clearSelection(); int xv1 = d_ptr->m_clickPos.x(); int xv2 = e->pos().x(); if (xv1 > xv2) { int temp = xv1; xv1 = xv2; xv2 = temp; } int yv1 = d_ptr->m_clickPos.y(); int yv2 = e->pos().y(); if (yv1 > yv2) { int temp = yv1; yv1 = yv2; yv2 = temp; } QPoint p1, p2; if (yv2 < d_ptr->m_handleSize / 2) { p1 = QPoint(xv1, yv2); p2 = QPoint(xv2, yv2); } else if (yv1 > d_ptr->m_handleSize / 2) { p1 = QPoint(xv1, yv1); p2 = QPoint(xv2, yv1); } else { p1 = QPoint(xv1, qRound(d_ptr->m_handleSize / 2)); p2 = QPoint(xv2, qRound(d_ptr->m_handleSize / 2)); } QList<QtGradientStop *> beginList = d_ptr->stopsAt(p1); QList<QtGradientStop *> endList = d_ptr->stopsAt(p2); double x1 = d_ptr->fromViewport(xv1); double x2 = d_ptr->fromViewport(xv2); QListIterator<QtGradientStop *> itStop(d_ptr->m_stops); while (itStop.hasNext()) { QtGradientStop *stop = itStop.next(); if ((stop->position() >= x1 && stop->position() <= x2) || beginList.contains(stop) || endList.contains(stop)) d_ptr->m_model->selectStop(stop, true); else d_ptr->m_model->selectStop(stop, false); } }}void QtGradientStopsWidget::mouseDoubleClickEvent(QMouseEvent *e){ if (!d_ptr->m_model) return; if (e->button() != Qt::LeftButton) return; if (d_ptr->m_clickPos != e->pos()) { mousePressEvent(e); return; } d_ptr->m_dragging = true; d_ptr->m_dragStops.clear(); d_ptr->m_dragOriginal.clear(); QtGradientStop *stop = d_ptr->newStop(e->pos()); if (!stop) return; d_ptr->m_model->clearSelection(); d_ptr->m_model->selectStop(stop, true); d_ptr->setupDrag(stop, e->pos().x()); viewport()->update();}void QtGradientStopsWidget::keyPressEvent(QKeyEvent *e){ if (!d_ptr->m_model) return; if (e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace) { d_ptr->m_model->deleteStops(); } else if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right || e->key() == Qt::Key_Home || e->key() == Qt::Key_End) { QMap<qreal, QtGradientStop *> stops = d_ptr->m_model->stops(); if (stops.isEmpty()) return; QtGradientStop *newCurrent = 0; QtGradientStop *current = d_ptr->m_model->currentStop(); if (!current || e->key() == Qt::Key_Home || e->key() == Qt::Key_End) { if (e->key() == Qt::Key_Left || e->key() == Qt::Key_Home) newCurrent = stops.constBegin().value(); else if (e->key() == Qt::Key_Right || e->key() == Qt::Key_End) newCurrent = (--stops.constEnd()).value(); } else { QMap<qreal, QtGradientStop *>::ConstIterator itStop = stops.constBegin(); while (itStop.value() != current) itStop++; if (e->key() == Qt::Key_Left && itStop != stops.constBegin()) itStop--; else if (e->key() == Qt::Key_Right && itStop != --stops.constEnd()) itStop++; newCurrent = itStop.value(); } d_ptr->m_model->clearSelection(); d_ptr->m_model->selectStop(newCurrent, true); d_ptr->m_model->setCurrentStop(newCurrent); d_ptr->ensureVisible(newCurrent); } else if (e->key() == Qt::Key_A) { if (e->modifiers() & Qt::ControlModifier) d_ptr->m_model->selectAll(); }}void QtGradientStopsWidget::paintEvent(QPaintEvent *e){ Q_UNUSED(e) if (!d_ptr->m_model) return; QSize size = viewport()->size(); int w = size.width(); double h = size.height() - d_ptr->m_handleSize; if (w <= 0) return; QPixmap pix(size); QPainter p(viewport()); if (!d_ptr->m_backgroundTransparent) { int pixSize = 20; QPixmap pm(2 * pixSize, 2 * pixSize); QPainter pmp(&pm); pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray); pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray); pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray); pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray); p.end(); p.begin(&pix); p.setBrushOrigin((size.width() % pixSize + pixSize) / 2, (size.height() % pixSize + pixSize) / 2); p.fillRect(viewport()->rect(), pm); p.setBrushOrigin(0, 0); } double viewBegin = (double)w * horizontalScrollBar()->value() / d_ptr->m_scaleFactor; QListIterator<QtGradientStop *> itStop(d_ptr->m_stops); if (h > 0) { QLinearGradient lg(0, 0, w, 0); while (itStop.hasNext()) { QtGradientStop *stop = itStop.next(); lg.setColorAt(stop->position(), stop->color()); } QImage img(w, 1, QImage::Format_ARGB32_Premultiplied); QPainter p1(&img); p1.setCompositionMode(QPainter::CompositionMode_Source); if (viewBegin != 0) p1.translate(-viewBegin, 0); if (d_ptr->m_zoom != 1) p1.scale(d_ptr->m_zoom, 1); p1.fillRect(0, 0, w, 1, lg); p.fillRect(QRectF(0, d_ptr->m_handleSize, w, h), QPixmap::fromImage(img)); } //p2.fillRect(QRectF(0, 0, w, size.height()), QPixmap::fromImage(img)); // handles int val = horizontalScrollBar()->value(); int max = horizontalScrollBar()->maximum(); double begin = (double)val / (d_ptr->m_scaleFactor + max); double end = (double)(val + d_ptr->m_scaleFactor) / (d_ptr->m_scaleFactor + max); double handleWidth = d_ptr->m_handleSize * d_ptr->m_scaleFactor / (w * (d_ptr->m_scaleFactor + max)); QColor insideColor = QColor::fromRgb(0x20, 0x20, 0x20, 0xFF); QColor borderColor = QColor(Qt::white); QColor drawColor; QColor back1 = QColor(Qt::lightGray); QColor back2 = QColor(Qt::darkGray); QColor back = QColor::fromRgb((back1.red() + back2.red()) / 2, (back1.green() + back2.green()) / 2, (back1.blue() + back2.blue()) / 2); QPen pen; p.setRenderHint(QPainter::Antialiasing); itStop.toBack(); while (itStop.hasPrevious()) { QtGradientStop *stop = itStop.previous(); double x = stop->position(); if (x >= begin - handleWidth / 2 && x <= end + handleWidth / 2) { double viewX = x * w * (d_ptr->m_scaleFactor + max) / d_ptr->m_scaleFactor - viewBegin; p.save(); QColor c = stop->color(); if ((0.3 * c.redF() + 0.59 * c.greenF() + 0.11 * c.blueF()) * c.alphaF() + (0.3 * back.redF() + 0.59 * back.greenF() + 0.11 * back.blueF()) * (1.0 - c.alphaF()) < 0.5) { drawColor = QColor::fromRgb(0xC0, 0xC0, 0xC0, 0xB0); } else { drawColor = QColor::fromRgb(0x40, 0x40, 0x40, 0x80); } QRectF rect(viewX - d_ptr->m_handleSize / 2, 0, d_ptr->m_handleSize, d_ptr->m_handleSize); rect.adjust(0.5, 0.5, -0.5, -0.5); if (h > 0) { pen.setWidthF(1); QLinearGradient lg(0, d_ptr->m_handleSize, 0, d_ptr->m_handleSize + h / 2); lg.setColorAt(0, drawColor); QColor alphaZero = drawColor; alphaZero.setAlpha(0); lg.setColorAt(1, alphaZero); pen.setBrush(lg); p.setPen(pen); p.drawLine(QPointF(viewX, d_ptr->m_handleSize), QPointF(viewX, d_ptr->m_handleSize + h / 2)); pen.setWidthF(1); pen.setBrush(drawColor); p.setPen(pen); QRectF r1 = rect.adjusted(0.5, 0.5, -0.5, -0.5); QRectF r2 = rect.adjusted(1.5, 1.5, -1.5, -1.5); QColor inColor = QColor::fromRgb(0x80, 0x80, 0x80, 0x80); if (!d_ptr->m_model->isSelected(stop)) { p.setBrush(stop->color()); p.drawEllipse(rect); } else { pen.setBrush(insideColor); pen.setWidthF(2); p.setPen(pen); p.setBrush(Qt::NoBrush); p.drawEllipse(r1); pen.setBrush(inColor); pen.setWidthF(1); p.setPen(pen); p.setBrush(stop->color()); p.drawEllipse(r2); } if (d_ptr->m_model->currentStop() == stop) { p.setBrush(Qt::NoBrush); pen.setWidthF(5); pen.setBrush(drawColor); int corr = 4; if (!d_ptr->m_model->isSelected(stop)) { corr = 3; pen.setWidthF(7); } p.setPen(pen); p.drawEllipse(rect.adjusted(corr, corr, -corr, -corr)); } } p.restore(); } } if (!d_ptr->m_backgroundTransparent) { p.end(); p.begin(viewport()); p.drawPixmap(0, 0, pix); }}void QtGradientStopsWidget::focusInEvent(QFocusEvent *e){ Q_UNUSED(e) viewport()->update();}void QtGradientStopsWidget::focusOutEvent(QFocusEvent *e){ Q_UNUSED(e) viewport()->update();}void QtGradientStopsWidget::contextMenuEvent(QContextMenuEvent *e){ if (!d_ptr->m_model) return; d_ptr->m_clickPos = e->pos(); QMenu menu(this); QAction *newStopAction = new QAction(tr("New Stop"), &menu); QAction *deleteAction = new QAction(tr("Delete"), &menu); QAction *selectAllAction = new QAction(tr("Select All"), &menu); if (d_ptr->m_model->selectedStops().isEmpty() && !d_ptr->m_model->currentStop()) deleteAction->setEnabled(false); connect(newStopAction, SIGNAL(triggered()), this, SLOT(slotNewStop())); connect(deleteAction, SIGNAL(triggered()), this, SLOT(slotDelete())); connect(selectAllAction, SIGNAL(triggered()), this, SLOT(slotSelectAll())); menu.addAction(newStopAction); menu.addAction(deleteAction); menu.addAction(selectAllAction); menu.exec(e->globalPos());}void QtGradientStopsWidget::setZoom(double zoom){ double z = zoom; if (z < 1) z = 1; else if (z > 100) z = 100; if (d_ptr->m_zoom == z) return; d_ptr->m_zoom = z; int oldMax = horizontalScrollBar()->maximum(); int oldVal = horizontalScrollBar()->value(); horizontalScrollBar()->setRange(0, qRound(d_ptr->m_scaleFactor * (d_ptr->m_zoom - 1))); int newMax = horizontalScrollBar()->maximum(); double newVal = (oldVal + (double)d_ptr->m_scaleFactor / 2) * (newMax + d_ptr->m_scaleFactor) / (oldMax + d_ptr->m_scaleFactor) - (double)d_ptr->m_scaleFactor / 2; horizontalScrollBar()->setValue(qRound(newVal)); viewport()->update();}double QtGradientStopsWidget::zoom() const{ return d_ptr->m_zoom;}#include "moc_qtgradientstopswidget.cpp"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?