主要思路:
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. 【转】ASP.NET MVC 数据验证及相关内容

    原文地址:http://www.jb51.net/article/56713.htm 一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验 ...

  2. Unity3D基础学习 NGUI Example 7-Scroll View(Panel)制作固定包裹栏,点击传递参数显示物体

    最终效果如下: 实现ScrollView主要是NGUI的三个脚本"UIDraggable Panel","UIGrid","UIDrag Panel ...

  3. java JMS消息队列

    http://blog.csdn.net/shirdrn/article/details/6362792 http://haohaoxuexi.iteye.com/blog/1893038 http: ...

  4. 在SQL Server 中启用 FileStream

    最近在研究在数据库中存储大数据文件,看到了FileStream 这个功能,记录下来以备后用 FileStream 一般在安装的时候默认是不启用的,如果你留意的话,在选择数据库文件路径那个窗口,有一个标 ...

  5. Linux磁盘设备文件(sda,sdb,sdc…)变化问题

    在Linux下往往会碰到这样的问题,磁盘的设备文件,比如/dev/sda, sdb, sdc等等在某些情况下会混乱掉,比如sda变成了sdb或者sdc变成了sdb等等,这样无形中会导致磁盘设备管理的混 ...

  6. SQL 使用Cursor(游标)遍历结果集

    使用Cursor(游标)可以在存储过程中遍历select 结果集,对其进行相关的操作. Cursor(游标)语法格式 DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段 ...

  7. LINQ简明教程:数据排序、分组、过滤

    LINQ可以对很多数据源进行查询操作,比如数据库.数组(array).链表(list).XML文件等.在本文中,我将从数组中提取数据,这些数据是10个最受欢迎的国家.有一个类叫Countries,有c ...

  8. GIt/Github常用命令

    1)git init:初始化本地仓库 2)创建文件:touch read.txt 3)当操作本地的文件时,使用常用的命令,如(mv,ls..)就可以操作,当操作暂存区的文件时需要在命令前家git,并且 ...

  9. oracle where与having

    where与having可以过滤,一般来说尽量使用where ,但是如果过滤条件中有组函数,只能使用having SQL> select deptno,avg(sal) from emp gro ...

  10. CSS布局注意(纯属个人总结)

    和CSS样式有关多用class,和后台数据有关多用id. 1.使用绝对定位时(偏移量如:top,left...),如果父类没有相对定位,使用绝对定位的元素是相对根元素(即<html>标签) ...