C++/Qt/QPixmap

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Create pixmal with QPixmap, save to png file

<source lang="cpp"> Foundations of Qt Development\Chapter07\paths\main.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QApplication>
  2. include <QPainter>
  3. include <QPainterPath>
  4. include <QPixmap>

int main( int argc, char **argv ) {

 QApplication app( argc, argv );
 
 QPixmap pixmap( 200, 200 );
 pixmap.fill( Qt::white );
   
 QPainterPath path;
 
 path.addEllipse( 80, 80, 80, 80 );
 
 path.moveTo( 120, 120 );
 path.lineTo( 120, 40 );
 path.arcTo( 40, 40, 160, 160, 90, 90 );
 path.lineTo( 120, 120 );
 
 QFont font = QApplication::font();
 font.setPixelSize( 40 );
 
 path.addText( 20, 180, font, "Path" );
 
 QPainter painter( &pixmap );
 painter.setRenderHint( QPainter::Antialiasing );
 
 painter.setPen( Qt::black );
 painter.setBrush( Qt::gray );
 
 painter.drawPath( path );
 
 pixmap.save( "path.png" );
 
 return 0;

}


 </source>


Create screen shot

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef SCREENSHOT_H
  2. define SCREENSHOT_H
  3. include <QPixmap>
  4. include <QWidget>

QT_BEGIN_NAMESPACE class QCheckBox; class QGridLayout; class QGroupBox; class QHBoxLayout; class QLabel; class QPushButton; class QSpinBox; class QVBoxLayout; QT_END_NAMESPACE

class Screenshot : public QWidget {

   Q_OBJECT

public:

   Screenshot();

protected:

   void resizeEvent(QResizeEvent *event);

private slots:

   void newScreenshot();
   void saveScreenshot();
   void shootScreen();
   void updateCheckBox();

private:

   void createOptionsGroupBox();
   void createButtonsLayout();
   QPushButton *createButton(const QString &text, QWidget *receiver,
                             const char *member);
   void updateScreenshotLabel();
   QPixmap originalPixmap;
   QLabel *screenshotLabel;
   QGroupBox *optionsGroupBox;
   QSpinBox *delaySpinBox;
   QLabel *delaySpinBoxLabel;
   QCheckBox *hideThisWindowCheckBox;
   QPushButton *newScreenshotButton;
   QPushButton *saveScreenshotButton;
   QPushButton *quitScreenshotButton;
   QVBoxLayout *mainLayout;
   QGridLayout *optionsGroupBoxLayout;
   QHBoxLayout *buttonsLayout;

};

  1. endif


  1. include <QtGui>
  2. include "screenshot.h"

Screenshot::Screenshot() {

   screenshotLabel = new QLabel;
   screenshotLabel->setSizePolicy(QSizePolicy::Expanding,
                                  QSizePolicy::Expanding);
   screenshotLabel->setAlignment(Qt::AlignCenter);
   screenshotLabel->setMinimumSize(240, 160);
   createOptionsGroupBox();
   createButtonsLayout();
   mainLayout = new QVBoxLayout;
   mainLayout->addWidget(screenshotLabel);
   mainLayout->addWidget(optionsGroupBox);
   mainLayout->addLayout(buttonsLayout);
   setLayout(mainLayout);
   shootScreen();
   delaySpinBox->setValue(5);
   setWindowTitle(tr("Screenshot"));
   resize(300, 200);

}

void Screenshot::resizeEvent(QResizeEvent * /* event */) {

   QSize scaledSize = originalPixmap.size();
   scaledSize.scale(screenshotLabel->size(), Qt::KeepAspectRatio);
   if (!screenshotLabel->pixmap()
           || scaledSize != screenshotLabel->pixmap()->size())
       updateScreenshotLabel();

}

void Screenshot::newScreenshot() {

   if (hideThisWindowCheckBox->isChecked())
       hide();
   newScreenshotButton->setDisabled(true);
   QTimer::singleShot(delaySpinBox->value() * 1000, this, SLOT(shootScreen()));

}

void Screenshot::saveScreenshot() {

   QString format = "png";
   QString initialPath = QDir::currentPath() + tr("/untitled.") + format;
   QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
                              initialPath,
                              tr("%1 Files (*.%2);;All Files (*)")
                              .arg(format.toUpper())
                              .arg(format));
   if (!fileName.isEmpty())
       originalPixmap.save(fileName, format.toAscii());

}

void Screenshot::shootScreen() {

   if (delaySpinBox->value() != 0)
       qApp->beep();
   originalPixmap = QPixmap(); // clear image for low memory situations
                               // on embedded devices.
   originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
   updateScreenshotLabel();
   newScreenshotButton->setDisabled(false);
   if (hideThisWindowCheckBox->isChecked())
       show();

}

void Screenshot::updateCheckBox() {

   if (delaySpinBox->value() == 0) {
       hideThisWindowCheckBox->setDisabled(true);
       hideThisWindowCheckBox->setChecked(false);
   }
   else
       hideThisWindowCheckBox->setDisabled(false);

}

void Screenshot::createOptionsGroupBox() {

   optionsGroupBox = new QGroupBox(tr("Options"));
   delaySpinBox = new QSpinBox;
   delaySpinBox->setSuffix(tr(" s"));
   delaySpinBox->setMaximum(60);
   connect(delaySpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateCheckBox()));
   delaySpinBoxLabel = new QLabel(tr("Screenshot Delay:"));
   hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"));
   optionsGroupBoxLayout = new QGridLayout;
   optionsGroupBoxLayout->addWidget(delaySpinBoxLabel, 0, 0);
   optionsGroupBoxLayout->addWidget(delaySpinBox, 0, 1);
   optionsGroupBoxLayout->addWidget(hideThisWindowCheckBox, 1, 0, 1, 2);
   optionsGroupBox->setLayout(optionsGroupBoxLayout);

}

void Screenshot::createButtonsLayout() {

   newScreenshotButton = createButton(tr("New Screenshot"),
                                      this, SLOT(newScreenshot()));
   saveScreenshotButton = createButton(tr("Save Screenshot"),
                                       this, SLOT(saveScreenshot()));
   quitScreenshotButton = createButton(tr("Quit"), this, SLOT(close()));
   buttonsLayout = new QHBoxLayout;
   buttonsLayout->addStretch();
   buttonsLayout->addWidget(newScreenshotButton);
   buttonsLayout->addWidget(saveScreenshotButton);
   buttonsLayout->addWidget(quitScreenshotButton);

}

QPushButton *Screenshot::createButton(const QString &text, QWidget *receiver,

                                     const char *member)

{

   QPushButton *button = new QPushButton(text);
   button->connect(button, SIGNAL(clicked()), receiver, member);
   return button;

}

void Screenshot::updateScreenshotLabel() {

   screenshotLabel->setPixmap(originalPixmap.scaled(screenshotLabel->size(),
                                                    Qt::KeepAspectRatio,
                                                    Qt::SmoothTransformation));

}


  1. include <QApplication>
  2. include "screenshot.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   Screenshot screenshot;
   screenshot.show();
   return app.exec();

}


 </source>


Set mask for QPixmap

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. include <QtGui>

int main() {

   int x, y;
   {
       QPixmap alpha("image-with-alpha.png");
       QPixmap alphacopy = alpha;
       alphacopy.setMask(alphacopy.mask());
   }

}


 </source>