C++/Qt/QPixmap
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. * */
- include <QApplication>
- include <QPainter>
- include <QPainterPath>
- 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$
-
- /
- ifndef SCREENSHOT_H
- define SCREENSHOT_H
- include <QPixmap>
- 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;
};
- endif
- include <QtGui>
- 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));
}
- include <QApplication>
- 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$
-
- /
- include <QtGui>
int main() {
int x, y; { QPixmap alpha("image-with-alpha.png"); QPixmap alphacopy = alpha; alphacopy.setMask(alphacopy.mask()); }
}
</source>