• 3205阅读
  • 0回复

不规则窗体 [复制链接]

上一主题 下一主题
离线chenxuelian
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-01
大家好,在网上看到一个不规则窗体的实现方法:
描述:a.png    窗口背景图
图片:

描述:mask.png    窗口掩码图
图片:

描述:toolbutton.png    按钮背景图
图片:

描述:toolbutton_mask.png    按钮掩码图
图片:

描述:runtime.png    示例运行时图
图片:

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

#include <QtGui/QWidget>

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

#endif


form.cpp:
Quote:
#include <QtGui/QPixmap>
#include <QtGui/QBitmap>
#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:
Quote:
#ifndef  TOOLBUTTON_H
#define  TOOLBUTTON_H

#include <QtGui/QToolButton>

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

#endif


toolbutton.cpp:
Quote:
#include <QtGui/QPixmap>
#include <QtGui/QBitmap>
#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:
Quote:
#include <QtGui/QApplication>
#include "form.h"

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

通过这种方法,可以显示一个不规则的窗体,但如果将main修改下,
    QWidget *w = new QWidget;    
    w->setWindowTitle("GUI");
                     w->setGeometry(300,300,640, 480);
    Form form;
    form.setParent(w);
    w->.show();
就显示不出来了,请问这是什么原因啊?
我想实现的就是将这个不规则的窗体添加到另一个窗体上去。
[ 此帖被chenxuelian在2009-09-02 17:43重新编辑 ]
快速回复
限100 字节
 
上一个 下一个