qpixeltool.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 525 行 · 第 1/2 页
CPP
525 行
break; }}void QPixelTool::resizeEvent(QResizeEvent *){ grabScreen();}void QPixelTool::mouseMoveEvent(QMouseEvent *e){ if (m_mouseDown) m_dragCurrent = e->pos(); int x = e->x() / m_zoom; int y = e->y() / m_zoom; QImage im = m_buffer.toImage().convertToFormat(QImage::Format_RGB32); if (x < im.width() && y < im.height() && x >= 0 && y >= 0) { m_currentColor = im.pixel(x, y); update(); }}void QPixelTool::mousePressEvent(QMouseEvent *e){ if (!m_freeze) return; m_mouseDown = true; m_dragStart = e->pos();}void QPixelTool::mouseReleaseEvent(QMouseEvent *){ m_mouseDown = false;}void QPixelTool::contextMenuEvent(QContextMenuEvent *e){ bool tmpFreeze = m_freeze; m_freeze = true; QMenu menu; QAction title(QLatin1String("Qt Pixel Zooming Tool"), &menu); title.setEnabled(false); // Grid color options... QActionGroup gridGroup(this); QAction whiteGrid(QLatin1String("White grid"), &gridGroup); whiteGrid.setCheckable(true); whiteGrid.setChecked(m_gridActive == 2); whiteGrid.setShortcut(QKeySequence(Qt::Key_G)); QAction blackGrid(QLatin1String("Black grid"), &gridGroup); blackGrid.setCheckable(true); blackGrid.setChecked(m_gridActive == 1); blackGrid.setShortcut(QKeySequence(Qt::Key_G)); QAction noGrid(QLatin1String("No grid"), &gridGroup); noGrid.setCheckable(true); noGrid.setChecked(m_gridActive == 0); noGrid.setShortcut(QKeySequence(Qt::Key_G)); // Grid size options QAction incrGrid(QLatin1String("Increase grid size"), &menu); incrGrid.setShortcut(QKeySequence(Qt::Key_PageUp)); connect(&incrGrid, SIGNAL(triggered()), this, SLOT(increaseGridSize())); QAction decrGrid(QLatin1String("Decrease grid size"), &menu); decrGrid.setShortcut(QKeySequence(Qt::Key_PageDown)); connect(&decrGrid, SIGNAL(triggered()), this, SLOT(decreaseGridSize())); // Zoom options QAction incrZoom(QLatin1String("Zoom in"), &menu); incrZoom.setShortcut(QKeySequence(Qt::Key_Plus)); connect(&incrZoom, SIGNAL(triggered()), this, SLOT(increaseZoom())); QAction decrZoom(QLatin1String("Zoom out"), &menu); decrZoom.setShortcut(QKeySequence(Qt::Key_Minus)); connect(&decrZoom, SIGNAL(triggered()), this, SLOT(decreaseZoom())); // Freeze / Autoupdate QAction freeze(QLatin1String("Frozen"), &menu); freeze.setCheckable(true); freeze.setChecked(tmpFreeze); freeze.setShortcut(QKeySequence(Qt::Key_Space)); QAction autoUpdate(QLatin1String("Continous update"), &menu); autoUpdate.setCheckable(true); autoUpdate.setChecked(m_autoUpdate); autoUpdate.setShortcut(QKeySequence(Qt::Key_A)); // Copy to clipboard / save QAction save(QLatin1String("Save as image"), &menu); save.setShortcut(QKeySequence(QLatin1String("Ctrl+S"))); connect(&save, SIGNAL(triggered()), this, SLOT(saveToFile())); QAction copy(QLatin1String("Copy to clipboard"), &menu); copy.setShortcut(QKeySequence(QLatin1String("Ctrl+C"))); connect(©, SIGNAL(triggered()), this, SLOT(copyToClipboard())); menu.addAction(&title); menu.addSeparator(); menu.addAction(&whiteGrid); menu.addAction(&blackGrid); menu.addAction(&noGrid); menu.addSeparator(); menu.addAction(&incrGrid); menu.addAction(&decrGrid); menu.addSeparator(); menu.addAction(&incrZoom); menu.addAction(&decrZoom); menu.addSeparator(); menu.addAction(&freeze); menu.addAction(&autoUpdate); menu.addSeparator(); menu.addAction(&save); menu.addAction(©); menu.exec(mapToGlobal(e->pos())); // Read out grid settings if (noGrid.isChecked()) m_gridActive = 0; else if (blackGrid.isChecked()) m_gridActive = 1; else m_gridActive = 2; m_autoUpdate = autoUpdate.isChecked(); tmpFreeze = freeze.isChecked(); m_freeze = tmpFreeze;}QSize QPixelTool::sizeHint() const{ return m_initialSize;}void QPixelTool::grabScreen(){ QPoint mousePos = QCursor::pos(); if (mousePos == m_lastMousePos && !m_autoUpdate || rect().contains(mapToGlobal(mousePos))) return; int w = int(width() / float(m_zoom)); int h = int(height() / float(m_zoom)); if (width() % m_zoom > 0) ++w; if (height() % m_zoom > 0) ++h; int x = mousePos.x() - w/2; int y = mousePos.y() - h/2; m_buffer = QPixmap::grabWindow(qApp->desktop()->winId(), x, y, w, h); QRegion geom(x, y, w, h); QRect screenRect; for (int i=0; i<qApp->desktop()->numScreens(); ++i) screenRect |= qApp->desktop()->screenGeometry(i); geom -= screenRect; QVector<QRect> rects = geom.rects(); if (rects.size() > 0) { QPainter p(&m_buffer); p.translate(-x, -y); p.setPen(Qt::NoPen); p.setBrush(palette().color(QPalette::Dark)); p.drawRects(rects); } update(); m_lastMousePos = mousePos;}void QPixelTool::startZoomVisibleTimer(){ if (m_displayZoomId > 0) { killTimer(m_displayZoomId); } m_displayZoomId = startTimer(5000); setZoomVisible(true);}void QPixelTool::startGridSizeVisibleTimer(){ if (m_gridActive) { if (m_displayGridSizeId > 0) killTimer(m_displayGridSizeId); m_displayGridSizeId = startTimer(5000); m_displayGridSize = true; update(); }}void QPixelTool::setZoomVisible(bool visible){ m_displayZoom = visible; update();}void QPixelTool::toggleFreeze(){ m_freeze = !m_freeze; if (!m_freeze) m_dragStart = m_dragCurrent = QPoint();}void QPixelTool::setZoom(int zoom){ if (zoom > 0) { QPoint pos = m_lastMousePos; m_lastMousePos = QPoint(); m_zoom = zoom; grabScreen(); m_lastMousePos = pos; m_dragStart = m_dragCurrent = QPoint(); startZoomVisibleTimer(); }}void QPixelTool::toggleGrid(){ if (++m_gridActive > 2) m_gridActive = 0; update();}void QPixelTool::setGridSize(int gridSize){ if (m_gridActive && gridSize > 0) { m_gridSize = gridSize; startGridSizeVisibleTimer(); update(); }}void QPixelTool::copyToClipboard(){ QClipboard *cb = QApplication::clipboard(); cb->setPixmap(m_buffer);}void QPixelTool::saveToFile(){ bool oldFreeze = m_freeze; m_freeze = true; QString name = QFileDialog::getSaveFileName(this, QLatin1String("Save as image"), QString(), QLatin1String("*.png")); if (!name.endsWith(QLatin1String(".png"))) name.append(QLatin1String(".png")); m_buffer.save(name, "PNG"); m_freeze = oldFreeze;}void QPixelTool::showHelp(){ if (!m_assistantClient) m_assistantClient = new QAssistantClient( QLibraryInfo::location(QLibraryInfo::BinariesPath), this); QString filePath = QLibraryInfo::location(QLibraryInfo::DocumentationPath) + QLatin1String("/html/pixeltool-manual.html"); m_assistantClient->showPage(filePath);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?