Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263046
  • 博文数量: 37
  • 博客积分: 1126
  • 博客等级: 少尉
  • 技术积分: 930
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-29 17:22
文章分类

全部博文(37)

文章存档

2014年(1)

2013年(11)

2012年(19)

2009年(6)

我的朋友

分类: C/C++

2012-06-26 15:43:46

Palette/Mask方式


直接引用高手的帖子:

Qt中不规则窗体和部件的实现,不管是窗体还是部件,都是从QWidget派生而来的,所以它们的原理是一样的,都是设置部件的背景色或者按钮图标等为一个图像A,然后设置此部件的掩码为另一个图像B,这个图像B经过位与运算后,得到不规则的图像,这就行了下面,是一个简单的示例:
form.h:
引用

#ifndef  FORM_H
#define  FORM_H

#include

class Form : public QWidget
{
    Q_OBJECT
public:
    Form();
    ~Form();
};

#endif


form.cpp:
引用

#include
#include
#include "toolbutton.h"
#include "form.h"

Form::Form()
{
    QPalette p = palette();
    QPixmap img("a.png");
    QBitmap mask("mask.png");
    p.setBrush(QPalette::Window, QBrush(img));
    setPalette(p);
    setMask(mask);
    setWindowFlags(Qt::FramelessWindowHint);

    resize(600, 400);
    
    ToolButton *button = new ToolButton(this);
    button->move(200, 200);
}

Form::~Form()
{
}


toolbutton.h:
引用

#ifndef  TOOLBUTTON_H
#define  TOOLBUTTON_H

#include

class ToolButton : public QToolButton
{
    Q_OBJECT
public:
    ToolButton(QWidget *parent=0);
    ~ToolButton();
};

#endif


toolbutton.cpp:
引用

#include
#include
#include "toolbutton.h"

ToolButton::ToolButton(QWidget *parent)
    : QToolButton(parent)
{
    /*
    // 如果是非按钮类部件,则使用此段代码
    QPalette p = palette();
    p.setBrush(QPalette::Button, QBrush(QPixmap("toolbutton.png")));
    setPalette(p);
    /*/
    // 如果是按钮类部件,则使用此段代码
    setIcon(QIcon("toolbutton.png"));
    setIconSize(QSize(48, 48));
    //*********************************/
    setMask(QBitmap("toolbutton_mask.png"));

    setFixedSize(48, 48);
}

ToolButton::~ToolButton()
{
}


main.cpp:
引用

#include
#include "form.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    Form form;
    form.show();
    return app.exec();
}

QML方式[绝对可行]
这个就比较复杂了,涉及到Qt Quick以及QML的语法
写个例程吧,有兴趣的百度
.pro

点击(此处)折叠或打开

  1. QT += core gui declarative
.h

点击(此处)折叠或打开

  1. #include <QtDeclarative>
.cpp

点击(此处)折叠或打开

  1. QDeclarativeView *view= new QDeclarativeView;
  2. view->setSource(QUrl("qrc:/resources/qml/main.qml")); //注意自定义qml文件位置

  3. //这两行请务必同时使用
  4. view->setAttribute(Qt::WA_TranslucentBackground, true);
  5. view->setStyleSheet("background:transparent;");

  6. view->show();
.qml文件

点击(此处)折叠或打开

  1. import QtQuick 1.0
  2. Rectangle
  3. {
  4.     width: 350; height: 350
  5.     color: "transparent" //继续透明吧
  6.     Image
  7.     {
  8. z:0 //z可以理解为层数
  9. anchors.fill:parent //填满
  10. source: "qrc:/resources/images/mainWindow.png"
  11.      }
  12.          

  13.     Image
  14.     {
  15.  //坐标
  16. x:50
  17. y:44 
  18. z:1
  19. source: "qrc:/resources/images/button.png"
  20. MouseArea
  21. {
  22. anchors.fill:parent
  23.                 onClicked:
  24.                  {
  25.                       //do something
  26.                  }
  27.            }
  28.          }

  29. }

QStyle方式[这个方法基本没用,没法取消子控件的继承,希望css高手提点]

在构造函数中加入如下代码

点击(此处)折叠或打开

  1. setWindowFlags(Qt::FramelessWindowHint);///去掉标题栏 
  2.   
  3. //=========================半透明窗体========================================== 
  4. ///移除所有能移除的,包括状态栏,标题栏,工具栏什么的 
  5.   
  6. setAttribute(Qt::WA_TranslucentBackground, true); 
  7. this->setStyleSheet("border-image:url(background.png) 10 10 10 10 stretch stretch;"); ///使用border-image可以实现背景的拉伸 
  8. this->setStyleSheet("background-image:url(background.png);"); ///使用标准的 background-image ,适用于固定窗体,PNG图片要与窗口尺寸相等
需要注意的是,窗体的子控件会继承主窗体的QStyle,因此要删除多余不用的控件.若窗体上有其他必要的控件,比如按钮等,需要进行新的QStyle设置



阅读(19104) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

bloodkain2012-11-04 12:26:38

没明白你说的嵌入desktop是什么意思,但是我实验过,半透明,不规则窗体什么的是没问题的

愚人陈2012-10-29 13:03:01

(⊙_⊙)嗯,多谢博主,
之前看的这个了,没意识到和csdn是同一个id.
QML方式 和 setAttribute(Qt::WA_TranslucentBackground, true);
虽然支持半透明Png,但是嵌入desktop时会失效,不知道怎么改进.
-------
另: 我没用QStyle,直接在paintEvent绘图的,和QML效果一样,也是平时半透明png正常,嵌入桌面就不行了. 本来想写类似Win7桌面小工具的东西的.
我在考虑不嵌入桌面,然后监视显示桌面事件,不隐藏窗口.