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(&copy, 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(&copy);    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 + -
显示快捷键?