主要思路:
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. Android Monkey具体解释

    Monkey是一个执行在Android设备或者虚拟机上的程序,它能随机模拟一系列用户的操作.点击,滑动,能够用它来做压力測试. 在Monkey执行的过程中,它会产生并发送一系列的事件给系统,而且监听系 ...

  2. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  3. Html5选择图片并及时预览图片

    以往想要实现图片预览基本都是先传至服务器后等返回链接地址才能进行预览,使用Html5选择图片并及时预览图片的代码如下,使用起来更爽了. <!DOCTYPE html> <html l ...

  4. [HAOI2006]聪明的猴子

    /* 找出能连通所有点的一棵树 是的最大的边最小 很显然就是最小生成树. 堆优化prim. */ #include<iostream> #include<cstring> #i ...

  5. hdu 2190

    //hdu2190 水题  题意是给一个n*3的教室,用1*1,2*2的砖去铺满,有多少种铺法,一开始没发现这个规律,想了一下,应该是递归. #include <iostream> usi ...

  6. canvas 下载

    function saveFile(data, filename){ var save_link = document.createElementNS('http://www.w3.org/1999/ ...

  7. spring-junit的标注总结

    如果在测试类的类名上面添加了注解 @ContextConfiguration("meta/springConfigured.xml") 如何在标注了@Test的方法里面获取上面xm ...

  8. 执​行​o​r​a​c​l​e​函​数​的​四​种​方​法

    1.在定义函数时:如果有参数,则参数可有类型但是不加长度. 2.在执行函数: var/variable var_name var_type(如果数据类型是number则没有长度,如果数据类型是varc ...

  9. C++拾遗(九)类与动态内存分配(1)

    创建类时编译器自动生成以下成员函数(如果用户没有定义): 1.默认构造函数 2.拷贝构造函数 3.赋值操作符 4.默认析构函数 5.地址操作符 以下一一说明: 构造函数 构造函数在创建对象时被调用. ...

  10. 网页通用的测试用例(出处:: 51Testing-- lxp1119216)

    此题的考察目的:面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了解Web开发,以及设计Test case的能力 这个题目还是相当有难度的, 一般的人很难把这个题目回答好. 首先,你要了 ...