主要思路:
1:将窗体设为Qt::FramelessWindowHint(去掉标题栏)。
2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透。

3:重载程序的鼠标事件。

运行时截图(浅绿色的是桌面背景)

源代码:

    1. #include <QtGui>
    2. class IrregularWidget : public QWidget
    3. {
    4. Q_OBJECT
    5. public:
    6. IrregularWidget(QWidget *parent = 0);
    7. protected:
    8. void mousePressEvent(QMouseEvent *event);
    9. void mouseMoveEvent(QMouseEvent *event);
    10. void paintEvent(QPaintEvent *event);
    11. void enterEvent(QEvent *event);
    12. void leaveEvent(QEvent *event);
    13. private:
    14. QPoint m_CurrentPos;
    15. QPixmap m_Pixmap;
    16. };
    17. IrregularWidget::IrregularWidget(QWidget *parent)
    18. : QWidget(parent, Qt::FramelessWindowHint)
    19. {
    20. setWindowTitle("Irregular widget");
    21. //加载一幅有部分区域是透明的图片作为程序的界面
    22. m_Pixmap.load("delete.png");
    23. resize( m_Pixmap.size() );
    24. //不规则窗口的关键,将图片透明的地方设为穿透
    25. setMask( m_Pixmap.mask() );
    26. }
    27. void IrregularWidget::mousePressEvent(QMouseEvent *event)
    28. {
    29. //按住左键可以托动窗口,按下右键关闭程序
    30. if(event->button() == Qt::LeftButton)
    31. {
    32. m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
    33. event->accept();
    34. }
    35. else if(event->button() == Qt::RightButton)
    36. close();
    37. }
    38. void IrregularWidget::mouseMoveEvent(QMouseEvent *event)
    39. {
    40. if (event->buttons() && Qt::LeftButton)
    41. {
    42. move(event->globalPos() - m_CurrentPos);
    43. event->accept();
    44. }
    45. }
    46. void IrregularWidget::paintEvent(QPaintEvent *event)
    47. {
    48. QPainter painter(this);
    49. painter.drawPixmap(0, 0, m_Pixmap);
    50. }
    51. void IrregularWidget::leaveEvent(QEvent *event)
    52. {
    53. //鼠标离开窗口时是普通的指针
    54. setCursor(Qt::ArrowCursor);
    55. }
    56. void IrregularWidget::enterEvent(QEvent *event)
    57. {
    58. //鼠标留在窗口上时是一个手指
    59. setCursor(Qt::PointingHandCursor);
    60. }
    61. #include "main.moc"
    62. int main(int argc, char *argv[])
    63. {
    64. QApplication app(argc, argv);
    65. IrregularWidget *widget = new IrregularWidget;
    66. widget->show();
    67. return app.exec();
    68. }

http://blog.csdn.net/small_qch/article/details/7054750

QT:不规则窗口的实现的更多相关文章

  1. 给QT不规则窗口添加阴影

    在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...

  2. QT笔记之不规则窗口的实现

    QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...

  3. Qt 不规则窗体的实现(构造函数里setPaletteBackgroundPixmap后设置setMask)

    Skin(表皮) 是制作比较酷的软件界面的有利工具. 一个软件可以同时使用多种Skin 以取得不同的外观, 使同一个软件有截然不同的风格. 用户可以根据自己的喜好选择 不同的风格. 本节介绍使用 Qt ...

  4. Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)

    之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...

  5. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  6. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  7. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...

  8. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  9. 【Qt】窗口居中显示

    w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...

随机推荐

  1. Java中List转换为数组,数组转List

    今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下: ArrayList<String> list=new ArrayList<String>();     ...

  2. Spring 3.2 ClassMetadataReadingVisitor 错误

    nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.clas ...

  3. WORLD OPERATS

        word文章设置无法复制 通常我们会采用设置密码的方式,规定某个文档的使用范围. 但这种方法是有一个局限,那就是可以观看文档的人未必靠谱,万一复制了文档的重要内容怎么办? 因此,不妨考虑加上禁 ...

  4. wxPython学习笔记(初识)

    今天正式开始学习wxPython,基于对类的不熟悉,理解有点生硬,但还是做了些笔记. 1.是什么组成了一个wxpython程序? 一个wxpython程序必须有一个application(wx.App ...

  5. TeamViewer或者向日葵等无法成功远程登录

    之前一直能正常远程的两台电脑,今天不知道什么原因,莫名其妙的就无法登录了. 更悲催的时,今天早上走的时候,忘把TeamViewer或者向日葵软件启动了. 还好,我登录向日葵官网,在管理中心设置里面开启 ...

  6. [Angular 2] Get start with Firebase

    Create a Firebase Servcie: import {Injectable} from 'angular2/core'; import {Http, Response} from 'a ...

  7. Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37730469 在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图 ...

  8. 2_Linux_文件和权限处理命令

    三.Linux的常用命令 1.文件命名规范 1)除了/之外,所有的字符都合法,文件名中不能包含/符号 2)有些字符最好不用,如空格.制表符.退格符和字符@#$&() 3)避免使用.作为普通文件 ...

  9. 基于jQuery仿uploadify的HTML5图片上传控件jquery.html5uploader

    (function($){ var methods = { init:function(options){ return this.each(function(){ var $this = $(thi ...

  10. memcache和activemq使用连接,然后close

    memcache和activemq使用连接,然后close