📄 mainwindow.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 + -