⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwindow.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2004-2006 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.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 GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtGui>#include "imagemodel.h"#include "mainwindow.h"#include "pixeldelegate.h"MainWindow::MainWindow() : QMainWindow(){    currentPath = QDir::home().absolutePath();    model = new ImageModel(QImage(), this);    QWidget *centralWidget = new QWidget;    view = new QTableView;    view->setShowGrid(false);    view->horizontalHeader()->hide();    view->verticalHeader()->hide();    PixelDelegate *delegate = new PixelDelegate(this);    view->setItemDelegate(delegate);    QLabel *pixelSizeLabel = new QLabel(tr("Pixel size:"));    QSpinBox *pixelSizeSpinBox = new QSpinBox;    pixelSizeSpinBox->setMinimum(1);    pixelSizeSpinBox->setMaximum(32);    pixelSizeSpinBox->setValue(12);    QMenu *fileMenu = new QMenu(tr("&File"), this);    QAction *openAction = fileMenu->addAction(tr("&Open..."));    openAction->setShortcut(QKeySequence(tr("Ctrl+O")));    printAction = fileMenu->addAction(tr("&Print..."));    printAction->setEnabled(false);    printAction->setShortcut(QKeySequence(tr("Ctrl+P")));    QAction *quitAction = fileMenu->addAction(tr("E&xit"));    quitAction->setShortcut(QKeySequence(tr("Ctrl+Q")));    QMenu *helpMenu = new QMenu(tr("&Help"), this);    QAction *aboutAction = helpMenu->addAction(tr("&About"));    menuBar()->addMenu(fileMenu);    menuBar()->addSeparator();    menuBar()->addMenu(helpMenu);    connect(openAction, SIGNAL(triggered()), this, SLOT(chooseImage()));    connect(printAction, SIGNAL(triggered()), this, SLOT(printImage()));    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));    connect(aboutAction, SIGNAL(triggered()), this, SLOT(showAboutBox()));    connect(pixelSizeSpinBox, SIGNAL(valueChanged(int)),            delegate, SLOT(setPixelSize(int)));    connect(pixelSizeSpinBox, SIGNAL(valueChanged(int)),            this, SLOT(updateView()));    QHBoxLayout *controlsLayout = new QHBoxLayout;    controlsLayout->addWidget(pixelSizeLabel);    controlsLayout->addWidget(pixelSizeSpinBox);    controlsLayout->addStretch(1);    QVBoxLayout *mainLayout = new QVBoxLayout;    mainLayout->addWidget(view);    mainLayout->addLayout(controlsLayout);    centralWidget->setLayout(mainLayout);    setCentralWidget(centralWidget);    setWindowTitle(tr("Pixelator"));    resize(640, 480);}void MainWindow::chooseImage(){    QString fileName = QFileDialog::getOpenFileName(this,        tr("Choose an image"), currentPath, "*");    if (!fileName.isEmpty())        openImage(fileName);}void MainWindow::openImage(const QString &fileName){    QImage image;    if (image.load(fileName)) {        ImageModel *newModel = new ImageModel(image, this);        view->setModel(newModel);        delete model;        model = newModel;        if (!fileName.startsWith(":/")) {            currentPath = fileName;            setWindowTitle(tr("%1 - Pixelator").arg(currentPath));        }        printAction->setEnabled(true);        updateView();    }}void MainWindow::printImage(){    if (model->rowCount(QModelIndex())*model->columnCount(QModelIndex())        > 90000) {        int answer = QMessageBox::question(this, tr("Large Image Size"),            tr("The printed image may be very large. Are you sure that "               "you want to print it?"),            QMessageBox::Yes, QMessageBox::No);        if (answer == QMessageBox::No)            return;    }    QPrinter printer(QPrinter::HighResolution);    QPrintDialog *dlg = new QPrintDialog(&printer, this);    dlg->setWindowTitle(tr("Print Image"));    if (dlg->exec() != QDialog::Accepted)        return;    QPainter painter;    painter.begin(&printer);    int rows = model->rowCount(QModelIndex());    int columns = model->columnCount(QModelIndex());    int sourceWidth = (columns+1) * ItemSize;    int sourceHeight = (rows+1) * ItemSize;    painter.save();    double xscale = printer.pageRect().width()/double(sourceWidth);    double yscale = printer.pageRect().height()/double(sourceHeight);    double scale = qMin(xscale, yscale);    painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,                      printer.paperRect().y() + printer.pageRect().height()/2);    painter.scale(scale, scale);    painter.translate(-sourceWidth/2, -sourceHeight/2);    QStyleOptionViewItem option;    QModelIndex parent = QModelIndex();    QProgressDialog progress(tr("Printing..."), tr("Cancel"), 0, rows, this);    float y = ItemSize/2;    for (int row = 0; row < rows; ++row) {        progress.setValue(row);        qApp->processEvents();        if (progress.wasCanceled())            break;        float x = ItemSize/2;        for (int column = 0; column < columns; ++column) {            option.rect = QRect(int(x), int(y), ItemSize, ItemSize);            view->itemDelegate()->paint(&painter, option,                                        model->index(row, column, parent));            x = x + ItemSize;        }        y = y + ItemSize;    }    progress.setValue(rows);    painter.restore();    painter.end();    if (progress.wasCanceled()) {        QMessageBox::information(this, tr("Printing canceled"),            tr("The printing process was canceled."), QMessageBox::Cancel);    }}void MainWindow::showAboutBox(){    QMessageBox::about(this, tr("About the Pixelator example"),        tr("This example demonstrates how a standard view and a custom\n"           "delegate can be used to produce a specialized representation\n"           "of data in a simple custom model."));}void MainWindow::updateView(){    for (int row = 0; row < model->rowCount(QModelIndex()); ++row)        view->resizeRowToContents(row);    for (int column = 0; column < model->columnCount(QModelIndex()); ++column)        view->resizeColumnToContents(column);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -