QDesktopWidget 乱谈?
来源:互联网 发布:java基础课程 编辑:程序博客网 时间:2024/05/13 07:11
- 在QWidget的众多派生类之中,QDesktopWidget比较特殊的一个(另一个比较特殊的是QAxWidget,定义了信号槽,却不使用Q_OBJECT这个宏)。
我们知道QDesktopWidget的作用就是获取和桌面相关的各种信息。恩,其实,它和QWidget没有多少共同点。
特殊之处?
class Q_WIDGETS_EXPORT QDesktopWidget : public QWidget{...protected: void resizeEvent(QResizeEvent *e);...};
一般很少见到直接从QWidget派生的类,却没有实现自己的paintEvent()函数。这QDesktopWidget便是这样的一个。
grabWidget()
- 如果你尝试使用 QPixmap::grabWidget()来抓取桌面,会发现什么都抓不到
QDesktopWidget只是桌面根窗口的一个封装器,而该桌面并不是你的进程的一部分。因此它不能通过常规QWidget的事件处理机制来接受任何事件。因此将QPixmap::grabWidget()应用到该窗口上并不能工作。
QPixmap::grabWidget()最终还是通过 paintEvent()函数内的操作进行绘制的。由于QDesktopWidget没有自己的paintEvent(),其父类QWidget的paintEvent()又是空的,故而...
注:
QPximap::grabWidget() 在Qt5中已被 QWidget::grab() 取代(因为QPixmap所在的QtGui模块不能依赖QWidget所在的QtWidgets模块)。
grabWindow()
如果要抓取桌面,需要用QPixmap::grabWindow(),与前者不同,该函数的参数是平台相关的句柄。而后是平台相关的代码根据该句柄抓取相应内容。
比如:在windows下,QDesktopWidget的句柄是通过系统的api函数GetDesktopWindow()获得,并没有创建一个新的窗口。
QWindowsWindow::WindowData WindowCreationData::create(const QWindow *w, const QRect &geometry, QString title) const{... if (desktop) { // desktop widget. No frame, hopefully? result.hwnd = GetDesktopWindow(); result.geometry = frameGeometry(result.hwnd, true); if (QWindowsContext::verboseWindows) qDebug().nospace() << "Created desktop window " << w << result.hwnd; return result; }...
而后
QPixmap QWindowsScreen::grabWindow(WId window, int x, int y, int width, int height) const{ RECT r; HWND hwnd = (HWND)window; GetClientRect(hwnd, &r);... // Create and setup bitmap HDC display_dc = GetDC(0); HDC bitmap_dc = CreateCompatibleDC(display_dc); HBITMAP bitmap = CreateCompatibleBitmap(display_dc, width, height); HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap); // copy data HDC window_dc = GetDC(hwnd); BitBlt(bitmap_dc, 0, 0, width, height, window_dc, x, y, SRCCOPY | CAPTUREBLT);...
注: 在Qt5中 QPixmap::grabWindow()将被 QScreen::grabWindow() 取代
参考
http://qt-project.org/doc/qt-4.8/qdesktopwidget.html
http://lists.trolltech.com/qt-interest/2003-10/thread00688-0.html
- QDesktopWidget 乱谈?
- QT Qdesktopwidget
- qt 之 QDesktopWidget
- 窗体部件之QDesktopWidget
- 乱谈
- 面试乱谈
- java乱码乱谈
- 乱谈权限管理
- 设计乱谈
- 面试乱谈
- 并行乱谈
- 乱谈CEGUI
- 乱谈文件扩展名
- 乱谈2
- 记录系统乱谈
- 乱谈程序设计
- ms os 乱谈
- 移植之乱谈
- 设计模式6大原则:单一职责原则
- 解析XML生成菜单
- 在SQL Server中实现 Limit m, n 的功能
- 人生有两种境界
- Spring3.0.5
- QDesktopWidget 乱谈?
- MVC框架实现9---Smart框架Context实现
- winxp下编译openssl-1.0.0g
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
- 在MFC中使用Tab Control
- VS2010 + MFC 学习心得
- System.InvalidCastException: 指定的转换无效 Linq ToList()
- shell脚本批量修改目录下所有文件中的部分语句
- cvpaper