基于QMainWindow主窗体程序

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()); 
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值