写了一晚上
呵呵
还好
比vc简单多了
所有源码就这么多...

//ScreenSnaper.h
#ifndef SCREENSNAPER_H
#define SCREENSNAPER_H
#include <QtGui/QtGui>

class ScreenSnaper : public QWidget
{
Q_OBJECT
public:
ScreenSnaper(QWidget *parent=0);
private:
QPixmap fullScreenMap;
QPixmap snapMap;
QPixmap fullTempMap;
bool isDrawing;
QPoint startPoint;
QPoint endPonit;
QRect snapRect;
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void paint(QPixmap &pixmap);
void contextMenuEvent(QContextMenuEvent *event);
void showEvent(QShowEvent *event);
private slots:
void save();
};
#endif // SCREENSNAPER_H

//ScreenSnaper.cpp
#include "ScreenSnaper.h"
ScreenSnaper::ScreenSnaper(QWidget *parent)
: QWidget(parent)
{
isDrawing = false;
}
void ScreenSnaper::showEvent(QShowEvent *event)
{
fullScreenMap =
  QPixmap::grabWindow(QApplication::desktop()->winId());
fullTempMap = fullScreenMap;
showFullScreen();
setCursor(Qt::CrossCursor);
}
void ScreenSnaper::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
if (isDrawing)
{
  painter.drawPixmap(0, 0, fullTempMap);
}
else
{
  painter.drawPixmap(0, 0, fullTempMap);
}
}
void ScreenSnaper::mouseMoveEvent(QMouseEvent *event)
{
QPoint pt = event->pos();
if (isDrawing)
{
  fullTempMap = fullScreenMap;
  endPonit = event->pos();
  paint(fullTempMap);
}
else
{
  if (snapRect.contains(pt.x(), pt.y()))
  {
   setCursor(Qt::SizeAllCursor);
  }
  else
  {
   setCursor(Qt::CrossCursor);
  }
}
}
void ScreenSnaper::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
  isDrawing = true;
  startPoint = event->pos();
}
}
void ScreenSnaper::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
  isDrawing = false;
  endPonit = event->pos();
  snapRect = QRect(startPoint, endPonit);
  paint(fullTempMap);
}
}

void ScreenSnaper::paint(QPixmap &pixmap)
{
QPainter painter(&pixmap);
painter.drawRect(QRect(startPoint, endPonit));
update();
}
void ScreenSnaper::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Escape)
{
  close();
}
else if (event->key() == Qt::Key_Space)
{
  if (!snapRect.isNull())
  {
   save();
  }
}
}
void ScreenSnaper::save()
{
QString filename;
filename = QFileDialog::getSaveFileName(this, tr("保存图像"),
  QDir::currentPath(), tr("Image (*.jpg *.png *.bmp)"));
if (filename.isNull())
{
  return;
}
snapMap = QPixmap::grabWidget(this, snapRect);
snapMap.save(filename);
}
void ScreenSnaper::contextMenuEvent(QContextMenuEvent *event)
{
QAction *actionClose = new QAction(tr("退出  &Q"),this);
QAction *actionSave;
QMenu menu(this);
if (snapRect.contains(event->pos()))
{
  actionSave = new QAction(tr("保存为  &S"), this);
  menu.addAction(actionSave);
  connect(actionSave, SIGNAL(triggered()), this, SLOT(save()));
}
menu.addAction(actionClose);
connect(actionClose, SIGNAL(triggered()), this, SLOT(close()));
menu.exec(event->pos());
}

//main.cpp
#include <QtGui/QtGui>
#include <QtTest/QTest>
#include "ScreenSnaper.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
ScreenSnaper *screenSnaper;
screenSnaper = new ScreenSnaper();
QMessageBox box(QMessageBox::NoIcon, QObject::tr("ScreenSnaper"),
  QObject::tr("开始截图?")/*, QMessageBox::Yes | QMessageBox::No*/);
QAbstractButton *execBtn =
box.addButton(QObject::tr("开始截图"), QMessageBox::YesRole);
box.addButton(QObject::tr("退出截图"), QMessageBox::NoRole);
box.setWindowFlags(Qt::Widget);
box.exec();
if (box.clickedButton() == execBtn)
{
  screenSnaper->show();
}
else
{
  return 0;
}
return a.exec();
}