1.下面实现的是一个基本主窗口程序,包含一个菜单栏,一个工具栏,中央可编辑窗体以及状态栏
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QAction;
class QMenu;
class QToolBar;
class QTextEdit;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
void createMenus();//创建菜单
void createActions();//创建动作
void createToolBars();//创建工具栏
public slots:
void slotNewFile();
void slotOpenFile();
void slotSaveFile();
void slotCopy();
void slotCut();
void slotPaste();
void slotAbout();
private:
QTextCodec *codec;
QMenu *fileMenu;
QMenu *editMenu;
QMenu *aboutMenu;
QToolBar *fileTool;
QToolBar *editTool;
QAction *fileOpenAction;
QAction *fileNewAction;
QAction *fileSaveAction;
QAction *exitAction;
QAction *copyAction;
QAction *cutAction;
QAction *pasteAction;
QAction *aboutAction;
QTextEdit * text;
};
#endif // MAINWINDOW_H
构造函数
MainWindow::MainWindow()
{
setWindowTitle(tr("Doc"));
text = new QTextEdit(this);
setCentralWidget(text);//把QTextEdit作为主窗口的中央窗体
createActions();
/*QAction类为用户提供了一个统一的命令接口,无论是从菜单触发还是从工具栏触发,或者是快捷键触发
都调用同样的操作接口,达到同样的目的。
*/
createMenus();
createToolBars();
}
void MainWindow::createActions()
{
// file open action
fileOpenAction = new QAction(QIcon(":/images/open.png"),tr("Open"),this); // 打开文件
/*指定动作所用的图标时,使用的是QIcon(":/images/open.png"),需要在程序所在的文件夹下面新增
一个mainwindow.qrc文件用于说明程序中所用到的图标
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
<file>images/paste.png</file>
<file>images/save.png</file>
</qresource>
</RCC>
并且在.pro文件中加入一行:
RESOURCES=mainwindow.qrc
*/
fileOpenAction->setShortcut(tr("Ctrl+O"));//设置这个动作的快捷键
fileOpenAction->setStatusTip(tr("open a file"));//设定了状态条显示
connect(fileOpenAction,SIGNAL(triggered()),this,SLOT(slotOpenFile()));
// file new action
fileNewAction = new QAction(QIcon(":/images/new.png"),tr("New"),this); // 新建文件
fileNewAction->setShortcut(tr("Ctrl+N"));
fileNewAction->setStatusTip(tr("new file"));
connect(fileNewAction,SIGNAL(triggered()),this,SLOT(slotNewFile()));
// save file action
fileSaveAction = new QAction(QPixmap(":/images/save.png"),tr("Save"),this); // 保存文件
fileSaveAction->setShortcut(tr("Ctrl+S"));
fileSaveAction->setStatusTip(tr("save file"));
connect(fileSaveAction,SIGNAL(activated()),this,SLOT(slotSaveFile()));
// exit action
exitAction = new QAction(tr("Exit"), this); // 退出
exitAction->setShortcut(tr("Ctrl+Q"));
exitAction->setStatusTip(tr("exit"));
connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
cutAction = new QAction(QIcon(":/images/cut.png"), tr("Cut"), this); // 剪切
cutAction->setShortcut(tr("Ctrl+X"));
cutAction->setStatusTip(tr("cut to clipboard"));
connect(cutAction, SIGNAL(triggered()), text, SLOT(cut()));
copyAction = new QAction(QIcon(":/images/copy.png"), tr("Copy"), this); // 复制
copyAction->setShortcut(tr("Ctrl+C"));
copyAction->setStatusTip(tr("copy to clipboard"));
connect(copyAction, SIGNAL(triggered()), text, SLOT(copy()));
pasteAction = new QAction(QIcon(":/images/paste.png"), tr("Paste"), this); // 粘贴
pasteAction->setShortcut(tr("Ctrl+V"));
pasteAction->setStatusTip(tr("paste clipboard to selection"));
connect(pasteAction, SIGNAL(triggered()), text, SLOT(paste()));
aboutAction = new QAction(tr("About"), this); // 关于,可不指定图标,一般只在菜单栏中使用
connect(aboutAction, SIGNAL(triggered()), this, SLOT(slotAbout()));
}
在实现了各个动作之后,需要把它通过菜单及工具栏快捷键的方式体现出来。
void MainWindow::createMenus()
{
//在菜单栏中添加新菜单
fileMenu = menuBar()->addMenu(tr("File"));
editMenu = menuBar()->addMenu(tr("Edit"));
aboutMenu = menuBar()->addMenu(tr("Help"));
//添加菜单条目到菜单
fileMenu->addAction(fileNewAction);
fileMenu->addAction(fileOpenAction);
fileMenu->addAction(fileSaveAction);
fileMenu->addAction(exitAction);
editMenu->addAction(copyAction);
editMenu->addAction(cutAction);
editMenu->addAction(pasteAction);
aboutMenu->addAction(aboutAction);
}
创建工具栏
void MainWindow::createToolBars()
{
//编辑两个工具栏,并排显示
fileTool = addToolBar("File");
fileTool->setMovable(false);//设置工具条的可移动性,此处为不可移动
editTool = addToolBar("Edit");
fileTool->addAction(fileNewAction);
fileTool->addAction(fileOpenAction);
fileTool->addAction(fileSaveAction);
editTool->addAction(copyAction);
editTool->addAction(cutAction);
editTool->addAction(pasteAction);
}
标准打印对话框QPrintDialog的使用
2.打印文本
#ifndef PRINTTEXT_H
#define PRINTTEXT_H
#include <QtGui>
class PrintText : public QMainWindow
{
Q_OBJECT
public:
PrintText();
~PrintText();
void createMenus();
void createActions();
void createToolBars();
private:
QTextEdit *contentTextEdit;
QMenu *printMenu;
QAction *printAction;
QToolBar *printTool;
protected slots:
void slotPrint();
};
#endif
#include "printtext.h"
PrintText::PrintText()
: QMainWindow()
{
QFont f("ZYSong18030",12);
setFont(f);
setWindowTitle(tr("Printer"));
contentTextEdit = new QTextEdit(this);
setCentralWidget(contentTextEdit); //设置中央窗口部件
createActions(); //创建动作
createMenus(); //创建菜单
createToolBars(); //创建工具栏
QFile file("QPrinter.txt"); //创建一个file对象
if (file.open(QIODevice::ReadOnly|QIODevice::Text))//按行读取数据并显示在contentTextEdit中
{
QTextStream textStream(&file);
while(!textStream.atEnd())
{
contentTextEdit->append(textStream.readLine());
}
file.close();
}
}
PrintText::~PrintText()
{
}
void PrintText::createActions()
{
// print action
printAction = new QAction(QIcon(":/images/print.png"),tr("Print"),this);
printAction->setShortcut(tr("Ctrl+P"));
printAction->setStatusTip(tr("Print"));
connect(printAction,SIGNAL(triggered()),this,SLOT(slotPrint()));
}
void PrintText::createMenus()
{
printMenu = menuBar()->addMenu(tr("Print"));
printMenu->addAction(printAction);
}
void PrintText::createToolBars()
{
printTool = addToolBar("Print");
printTool->addAction(printAction);
}
void PrintText::slotPrint ()
{
QPrinter printer; //创建一个QPrinter对象
QPrintDialog printDialog(&printer, this);
/*参数为printer,QPrinterDialog是Qt提供的标准对话框,为打印机
的使用提供了一种方便,规范的方法。
*/
if (printDialog.exec()) //判断打印对话框显示后用户是否单击打印按钮
{
QTextDocument *doc = contentTextEdit->document();//获得QTextEdit对象的文档
doc->print(&printer);//打印
}
}
3.打印图像
打印图像实际上是在一个QPaintDevice中画图,与平常在QWidget,Qpixmap,Qimage中画图一样,都是在创建一个QPainter对象进行画图。
#ifndef PRINTIMAGE_H
#define PRINTIMAGE_H
#include <QtGui>
class PrintImage : public QMainWindow
{
Q_OBJECT
public:
PrintImage();
~PrintImage();
void createMenus();
void createActions();
void createToolBars();
private:
QImage image;
QLabel *imageLabel;
QMenu *printMenu;
QAction *printAction;
QToolBar *printTool;
protected slots:
void slotPrint();
};
#endif
#include "printimage.h"
PrintImage::PrintImage()
: QMainWindow()
{
QFont f("ZYSong18030",12);
setFont(f);
setWindowTitle(tr("PrintImage"));
imageLabel = new QLabel(this);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);
setCentralWidget(imageLabel); //设置中央窗口部件
createActions();
createMenus();
createToolBars();
if(image.load("tux.png"));//载入图片
{
imageLabel->setPixmap (QPixmap::fromImage(image));//在imageLabel中显示图片
resize(image.width(), image.height());
}
}
PrintImage::~PrintImage()
{
}
void PrintImage::createActions()
{
// print action
printAction = new QAction(QIcon(":/images/print.png"),tr("Print"),this);
printAction->setShortcut(tr("Ctrl+P"));
printAction->setStatusTip(tr("Print"));
connect(printAction,SIGNAL(triggered()),this,SLOT(slotPrint()));
}
void PrintImage::createMenus()
{
printMenu = menuBar()->addMenu(tr("Print"));
printMenu->addAction(printAction);
}
void PrintImage::createToolBars()
{
printTool = addToolBar("Print");
printTool->addAction(printAction);
}
void PrintImage::slotPrint ()
{
QPrinter printer;
QPrintDialog printDialog(&printer, this);
if (printDialog.exec()) //若用户单击打印按钮
{
QPainter painter(&printer);//指定绘图设备为QPrinter对象
QRect rect = painter.viewport();//获得QPainter对象的视口矩形
qWarning("rect.x()=%d,rect.y()=%d",rect.x(),rect.y());
qWarning("rect.width()=%d,rect.height()=%d",rect.width(),rect.height());
QSize size = image.size();//获得图像大小
qWarning("size.width()=%d,size.height()=%d",size.width(),size.height());
size.scale(rect.size(), Qt::KeepAspectRatio);//按照图形的比例大小重新设置视口矩形
qWarning("size.width()=%d,size.height()=%d",size.width(),size.height());
painter.setViewport(rect.x(), rect.y(),size.width(), size.height());
painter.setWindow(image.rect());//设置QPainter窗口大小为图像大小
painter.drawImage(0, 0, image);//打印
}
}
4.图片的旋转与缩放
使用QMatrix实现坐标变换
QMatrix类提供了世界坐标系统的2D转换功能,可以使窗体转换变形,可实现坐标系统的移动,缩放,变形以及旋转的功能
下面是其构造函数
ImgProcessor::ImgProcessor()
: QMainWindow()
{
QFont f("ZYSong18030",12);
setFont(f);
setWindowTitle(tr("Image Processor"));
imageLabel = new QLabel(this);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);//是否会根据其大小自动调节内容大小,默认为false.
setCentralWidget(imageLabel);//设置中央窗口部件
createActions();
createMenus();
createToolBars();
}
载入图形文件函数
void ImgProcessor::slotOpenFile ()
{
QString s = QFileDialog::getOpenFileName(
this, "open image file",
".",
"Image files (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)");
if(s != "")
{
if(img.load(s));
{
imageLabel->setPixmap (QPixmap::fromImage(img));
resize(img.width(), img.height());
}
}
}
图像的放大与缩小函数
void ImgProcessor::slotZoomIn ()//实现图形的放大功能
{
if(img.isNull())//行为的有效性判断
{
return;
}
QMatrix martix;//QMatrix类的实例
martix.scale (2,2); // 按照两倍的比例对水平和垂直方向进行放大
img=img.transformed(martix);//并将当前显示的图形按照该坐标矩阵进行转换
imageLabel->setPixmap (QPixmap::fromImage(img));//重新设置显示图形
resize(img.width(),img.height()); //调整大小
}
void ImgProcessor::slotZoomOut ()
{
if(img.isNull())
{
return;
}
QMatrix martix;
martix.scale(0.5,0.5);
img=img.transformed(martix);
imageLabel->setPixmap (QPixmap::fromImage(img));
resize(img.width(),img.height());
}
实现旋转函数
void ImgProcessor::slotRotate90 ()
{
if(img.isNull())
{
return;
}
QMatrix martix;
martix.rotate(90); //实现坐标的逆时针旋转
img=img.transformed(martix);
imageLabel->setPixmap (QPixmap::fromImage(img));
resize(img.width(),img.height());
}
垂直与水平镜像函数
void ImgProcessor::slotMirrorVertical ()//实现图形的垂直镜像
{
if(img.isNull())
{
return;
}
img=img.mirrored(false,true);//第一个参数表示水平,第二个参数表示垂直
imageLabel->setPixmap (QPixmap::fromImage(img));
resize(img.width(),img.height());
}
void ImgProcessor::slotMirrorHorizontal ()
{
if(img.isNull())
{
return;
}
img=img.mirrored(true,false);
imageLabel->setPixmap (QPixmap::fromImage(img));
resize(img.width(),img.height());
}