主要思路:
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. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  2. 如何给DropDownList控件设置样式(ASP.NET MVC)

    前话: 应学校领导要求,要给后台管理系统添加一个搜索功能,提供可选择选项.我选择使用DropDownList去实现,熟悉.net控件的都知道,DropDownList的样子非常丑,不论是边框长宽还是里 ...

  3. SCGHR 分析思路

    -- 分析某个模块业务 a:添加表,登记表,历史表,信息表 --- (把表名搞清楚,再看具体的字段) 先搞清楚大概的数据流向,在着手具体的数据,大处布局,小处着手 b:表中的字段,以及各表直接传递什么 ...

  4. Xcode7 国际化

    1.第一步 HaiTing_xcodeproj.png 2.第二不 HaiTing_xcodeproj 2.png 3.第三步 Localizable_strings.png 5第五步 ZLBMeVi ...

  5. HDU 1166 敌兵布阵(线段树)

    题目地址:pid=1166">HDU 1166 听说胡浩版的线段树挺有名的. 于是就拜訪了一下他的博客.详情戳这里.于是就全然仿照着胡浩大牛的风格写的代码. 至于原理.鹏鹏学长已经讲的 ...

  6. git clone之后自动checkout文件处理

    这个问题发生是因为不同操作系统的行结束符不一致导致的,可在clone之后在仓库根目录修改.gitattributes文件 简单处理的话,注释* text=auto这行即可.也可根据不同系统,做相应设定 ...

  7. 为什么要配置path环境变量?

    一:关于path环境变量--为了在任意目录下,使用javac/java命令 第一种配置方法: 通过配置path环境变量,我们可以使某个程序,比如javac.exe,在任意目录下都可以运行,而不用跑到j ...

  8. UCOS 中的中断处理

    最近遇到一个问题,当我在UCOS里调用系统延时"OSTimeDlyHMSM(0, 0, 0, 10)",程序进入硬件错误中断“HardFault_Handler”中. 我开始以为是 ...

  9. HUD 1251 难题统计

    /* 这题倒是没啥难度 字典树可搞 但是吧 空间是个问题 开始写成这样 struct node { int next[27],sum[27]; bool over; }t[maxn]; 死活过不了 开 ...

  10. 6、第六课,js jquery20150928

    1.声明事件,给事件添加动作 function MyClick() { alert("这是我的第一个js") } 2.js特点 A.js区分大小写 B.弱类型变量,定义一个变量 v ...