• 7617阅读
  • 12回复

简单的截屏对话框ScreenCutDialog [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2012-07-15
关键词: 截屏
简单的截屏对话框ScreenCutDialog ,代码仅供参考,无注释。

使用方法:
  1. ScreenCutDialog dlg;
  2. dlg.exec();
  3. QPixmap px = dlg.getPixmap();



ScreenCutDialog .hpp
  1. #ifndef SCREENCUTDILAOG_HPP
  2. #define SCREENCUTDIALOG_HPP
  3. #include <QtCore/QRect>
  4. #include <QtCore/QPoint>
  5. #include <QtGui/QDialog>
  6. #include <QtGui/QPixmap>
  7. class QMouseEvent;
  8. class QPaintEvent;
  9. class ScreenCutDialog : public QDialog
  10. {
  11.     Q_OBJECT
  12. public:
  13.     ScreenCutDialog(QWidget *parent = 0, Qt::WindowFlags f = 0);
  14.     virtual ~ScreenCutDialog();
  15.     QPixmap getPixmap();
  16. protected:
  17.     virtual void mousePressEvent(QMouseEvent *event);
  18.     virtual void mouseMoveEvent(QMouseEvent *event);
  19.     virtual void mouseReleaseEvent(QMouseEvent *event);
  20.     virtual void mouseDoubleClickEvent(QMouseEvent *event);
  21.     virtual void paintEvent(QPaintEvent *event);
  22. private:
  23.     bool _bDrag;
  24.     QPoint _pos;
  25.     QRect _rect;
  26.     QImage _image;
  27.     QImage _darkImage;
  28. };
  29. #endif


ScreenCutDialog .cpp
  1. #include <QtGui/QPainter>
  2. #include <QtGui/QMouseEvent>
  3. #include <QtGui/QPaintEvent>
  4. #include <QtGui/QApplication>
  5. #include <QtGui/QDesktopWidget>
  6. #include "ScreenCutDialog.hpp"
  7. ScreenCutDialog::ScreenCutDialog(QWidget *parent, Qt::WindowFlags f)
  8.     : QDialog(parent, f), _bDrag(false)
  9. {
  10.     setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint
  11.             | Qt::WindowStaysOnTopHint);
  12.     setWindowState(Qt::WindowFullScreen);
  13.     setCursor(Qt::CrossCursor);
  14.     QDesktopWidget *desk = QApplication::desktop();
  15.     setGeometry(desk->availableGeometry());
  16.     _image = QPixmap::grabWindow(desk->winId()).toImage();
  17.     _darkImage = _image;
  18.     int bytesPerLine = _darkImage.width() * _darkImage.depth() / 8;
  19.     int h = _darkImage.height();
  20.     for (int i = 0; i < h; i++)
  21.     {
  22.         unsigned char *lineBuf = _darkImage.scanLine(i);
  23.         for (int x = 0; x < bytesPerLine; x++)
  24.         {
  25.             lineBuf[x] /= 2;
  26.         }
  27.     }
  28. }
  29. ScreenCutDialog::~ScreenCutDialog()
  30. {
  31. }
  32. void ScreenCutDialog::mousePressEvent(QMouseEvent *event)
  33. {
  34.     _bDrag = true;
  35.     _pos = event->pos();
  36.     _rect = QRect(_pos.x(), _pos.y(), 0, 0);
  37.     QDialog::mousePressEvent(event);
  38. }
  39. void ScreenCutDialog::mouseMoveEvent(QMouseEvent *event)
  40. {
  41.     if (_bDrag = true)
  42.     {
  43.         QPoint pos = event->pos();
  44.         if (pos.x() > _pos.x())
  45.         {
  46.             if (pos.y() > _pos.y())
  47.             {
  48.                 _rect = QRect(_pos, pos);
  49.             }
  50.             else
  51.             {
  52.                 _rect = QRect(QPoint(_pos.x(), pos.y()),
  53.                             QPoint(pos.x(), _pos.y()));
  54.             }
  55.         }
  56.         else
  57.         {
  58.             if (pos.y() > _pos.y())
  59.             {
  60.                 _rect = QRect(QPoint(pos.x(), _pos.y()),
  61.                             QPoint(_pos.x(), pos.y()));
  62.             }
  63.             else
  64.             {
  65.                 _rect = QRect(pos, _pos);
  66.             }
  67.         }
  68.         update();
  69.     }
  70.     QDialog::mouseMoveEvent(event);
  71. }
  72. void ScreenCutDialog::mouseReleaseEvent(QMouseEvent *event)
  73. {
  74.     _bDrag = false;
  75.     QDialog::mouseReleaseEvent(event);
  76.     accept();
  77. }
  78. void ScreenCutDialog::mouseDoubleClickEvent(QMouseEvent *event)
  79. {
  80.     QDialog::mouseDoubleClickEvent(event);
  81.     /*
  82.     if (_rect.contains(event->pos()))
  83.     {
  84.         accept();
  85.     }
  86.     */
  87. }
  88. QPixmap ScreenCutDialog::getPixmap()
  89. {
  90.     QPixmap px(_rect.size());
  91.     QPainter p(&px);
  92.     p.drawImage(QRect(0, 0, _rect.width(), _rect.height()),
  93.             _image, _rect);
  94.     p.end();
  95.     return px;
  96. }
  97. void ScreenCutDialog::paintEvent(QPaintEvent *event)
  98. {
  99.     QPainter painter(this);
  100.     painter.drawImage(0, 0, _darkImage);
  101.     painter.drawImage(_rect, _image, _rect);
  102.     painter.drawRect(_rect);
  103. }
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zkh2006
只看该作者 1楼 发表于: 2012-07-15
版主  貌似改过版了啊
离线kimtaikee

只看该作者 2楼 发表于: 2012-07-15
回 1楼(zkh2006) 的帖子
恩,在悄无声息中进行的,”代码秀“是新加的版块吧,而却白老师更加积极了

离线XChinux

只看该作者 3楼 发表于: 2012-07-15
一直想对论坛做修改,所以原来一直是只有论坛,而没有其它内容,就是为了一旦开始改版时修改程序或移植程序时方便,但一直工作忙。去年有个大改计划,但后来夭折了,只处理了一部分,现在在想如何逐步处理。因为现在开放的功能比较多,所以不打算升级phpwind程序了,怕不兼容的地方太多。discuz对移动设备的支持要比phpwind好,但还是因为开放功能比较多,怕移植到discuz麻烦。这段时间发生的事情,导致大家对Qt的前途感到担忧,有感当时MeeGo兴趣的许多网站,现在大多都关门了,Qt发展的现状估计又会有一批网站会关闭,qt.csdn.net是Nokia与CSDN的官方合作,但尽管会有保留,但估计会没有官方合作的名号了。meego丢失了csdn一级频道,qt不要丢失啊。感到有必要在QTCN中有所动作,现在逐步做些改良吧。Qt桌面的发展问题不大,但现在移动平台、Windows下Metro界面开发,这两大问题,现在失去大公司的快速推动,进展会比较慢,想有作为,qt爱好者我们自己多贡献些吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线alexltr

只看该作者 4楼 发表于: 2012-07-16
    
Windows7 + Qt5.2.0      业余编程学习者
离线gongkongrs

只看该作者 5楼 发表于: 2012-07-18
      
只看该作者 6楼 发表于: 2012-07-23
支持下!
离线lyjbbq

只看该作者 7楼 发表于: 2012-08-17
  
离线ppdayz

只看该作者 8楼 发表于: 2012-08-21
      
离线xzoscar
只看该作者 9楼 发表于: 2012-08-21
该贴是杰作,我也得到过真传,呵呵,顶一贴
XZoscar@163.com
QQ,351565950
南京
离线ltpgt
只看该作者 10楼 发表于: 2012-10-20
离线dayqr

只看该作者 11楼 发表于: 2012-11-24
顶一贴
离线xpz123

只看该作者 12楼 发表于: 01-08
    
快速回复
限100 字节
 
上一个 下一个