主要思路:
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. otl获得sql出错位置(oracle)

    项目的一个需要,要获得sql出错的位置,从而给出类似sqlplus的错误提示(如下) sql出错原因易获得,记录在otl_exception::msg,但出错位置就不是那么容易了. 默认情况下otl异 ...

  2. Android开发学习之Camera

    今天本来想写一篇关于百度地图定位SDK的文章的,无奈根据官网提供的例子编写的程序始终无法运行,所以这个计划只能落空.那么今天要与大家分享的是Camera,即照相机.随着硬件能力的大幅提升,手机上各种依 ...

  3. icinga 被动模式 nsca 安装

    本文假设读者已安装好icinga,此外nsca本身nagios插件,icinga/nagios都适用 一.编译安装nsca1.编译,拷贝文件tar -vxzf nsca-2.7.2.tar.gz./c ...

  4. paip.gch预编译头不生效的原因以及解决:

    paip.gch预编译头不生效的原因以及解决: 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/a ...

  5. Lecture Halls

    Lecture Halls (会议安排)   时间限制(普通/Java):1000MS/10000MS     运行内存限制:65536KByte 总提交: 38            测试通过: 2 ...

  6. Linux用户磁盘配额

    一:内核中支持QUOTA: [root@localhost /]# grep  CONFIG_QUOTA /boot/config-3.10.0-123.el7.x86_64 CONFIG_QUOTA ...

  7. 关于lower_bound()的用法--NYOJ 201作业题

    lower_bound它有三个参数, 第一个和第二个是给定区间起点和终点的指针,第三个参数是要查找的数,它的作用原理是在给定的区间中进行二分查找,这个二分区间是前开后闭的,他返回第一个大于等于它的函数 ...

  8. request.ServerVariables获取环境变量

    Request.ServerVariables("HTTP_X_FORWARDED_FOR")  透过代理服务器取得客户端的真实IP地址,有些用此方法读取到的仍然是代理服务器的IP ...

  9. MySQL 数据表修复及数据恢复

    1. MYSQL数据表在什么情况下容易损坏? 服务器突然断电导致数据文件损坏. 强制关机,没有先关闭mysql 服务等.   2. 数据表损坏后的主要现象是什么? 从表中选择数据之时,得到如下错误:I ...

  10. MultipeerConnectivity

    Multipeer connectivity是一个使附近设备通过Wi-Fi网络.P2P Wi-Fi以及蓝牙个人局域网进行通信的框架.互相链接的节点可以安全地传递信息.流或是其他文件资源,而不用通过网络 ...