• 55109阅读
  • 36回复

Qt中不规则窗体和部件的实现 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2007-08-06
— 本帖被 XChinux 执行加亮操作(2007-08-06) —
Qt中不规则窗体和部件的实现,不管是窗体还是部件,都是从QWidget派生而来的,所以它们的原理是一样的,都是设置部件的背景色或者按钮图标等为一个图像A,然后设置此部件的掩码为另一个图像B,这个图像B经过位与运算后,得到不规则的图像,这就行了下面,是一个简单的示例:
form.h:

#ifndef  FORM_H
#define  FORM_H
#include <QtGui/QWidget>
class Form : public QWidget
{
    Q_OBJECT
public:
    Form();
    ~Form();
};
#endif


form.cpp:

#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:

#ifndef  TOOLBUTTON_H
#define  TOOLBUTTON_H

#include <QtGui/QToolButton>

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

#endif


toolbutton.cpp:

#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:

#include <QtGui/QApplication>
#include "form.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    Form form;
    form.show();
    return app.exec();
}
[ 此贴被XChinux在2007-08-07 00:25重新编辑 ]

小图 | 大图 图片

  • a.png    窗口背景图
  • mask.png    窗口掩码图
  • toolbutton.png    按钮背景图
  • toolbutton_mask.png    按钮掩码图
  • runtime.png    示例运行时图
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线jzj139
只看该作者 1楼 发表于: 2007-08-06
真实的开发中的其实有着很多需要解决的难题的
qt
离线XChinux

只看该作者 2楼 发表于: 2007-08-06
其它的问题用到的朋友自己解决去吧,哈哈,要休息了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mxw5495
只看该作者 3楼 发表于: 2007-08-07
多谢老大指点,以前只知道窗体能用setmask,原来按钮控件也可以,呵呵
离线jzj139
只看该作者 4楼 发表于: 2007-08-07
我这段时间做的就是这方面的代码编写工作
有空也可以写点东西  不过现在太累
还是交给老大写吧  呵呵
qt
离线幻想天空
只看该作者 5楼 发表于: 2007-08-19
请问老大,在qt中怎么实现窗口的透明度调节啊?十万火急!!!相当感谢!!
离线浪漫天使
只看该作者 6楼 发表于: 2007-08-19
void setWindowOpacity ( qreal level )


windowOpacity : double
This property holds the level of opacity for the window.
The valid range of opacity is from 1.0 (completely opaque) to 0.0 (completely transparent).
By default the value of this property is 1.0.
This feature is available on Mac OS X, X11 platforms that support the Composite extension, and Windows 2000 and later.
Note that under X11 you need to have a composite manager running, and the X11 specific _NET_WM_WINDOW_OPACITY atom needs to be supported by the window manager you are using.
Warning: Changing this property from opaque to transparent might issue a paint event that needs to be processed before the window is displayed correctly. This affects mainly the use of QPixmap::grabWindow(). Also note that semi-transparent windows update and resize significantly slower than opaque windows.
离线sunnylemon
只看该作者 7楼 发表于: 2008-11-11
楼上的你傻吗?把帮助文档的COPY出来有用吗?
--  --#
离线vrcats
只看该作者 8楼 发表于: 2008-11-12
楼上不要犯了嗔戒嘛,看帮助是最好的学习Qt方法
离线yurenjimi

只看该作者 9楼 发表于: 2008-12-15
QWidget::setWindowOpacity ( qreal level )

十试验证明是可行的。。。。楼上的楼上尝试一下再说……
hello world!!
离线c10h15n
只看该作者 10楼 发表于: 2008-12-16
Merci.
离线sikylori

只看该作者 11楼 发表于: 2008-12-29
非常感谢LZ,使用此方法实现了功能,再次感谢
离线sevear
只看该作者 12楼 发表于: 2009-01-29
发现我怎么画怎么都是黑的。。。。不知道怎么回事?
离线sevear
只看该作者 13楼 发表于: 2009-01-29
是我自己的错,居然图片路径写错了。。。
离线sevear
只看该作者 14楼 发表于: 2009-01-29
另外,直接用img.mask()不是比再用一张图片要好么?
离线wvins
只看该作者 15楼 发表于: 2009-01-30
谢谢老大,哈哈
收藏,虽然目前用不上
离线titicacafz

只看该作者 16楼 发表于: 2009-02-09
如果在这个类上面添加一个widget成员 怎么让这个成员显示出来啊??
离线xbl1999
只看该作者 17楼 发表于: 2009-05-31
收藏啦
离线haulm

只看该作者 18楼 发表于: 2009-05-31
楼主的程序如果在linux下运行,背景就有一大块白板了。
离线rqzrqh

只看该作者 19楼 发表于: 2009-07-27
GOOD
离线donglipeng
只看该作者 20楼 发表于: 2009-11-17
我想是规则的图形,用mask的话,位置怎么调节!!
离线zlz1215312
只看该作者 21楼 发表于: 2009-12-29
老大 请问在QT3中怎么实现
离线2nd090215
只看该作者 22楼 发表于: 2010-01-17
关注,
离线phymal

只看该作者 23楼 发表于: 2010-03-17
我都方法只用一幅图。
离线phymal

只看该作者 24楼 发表于: 2010-03-17
myclass::myclass()
{
    move(100,100);
    QPixmap pixmap("/mmc/mmca1/bin/show.png");
    QBitmap bitmap=pixmap.createHeuristicMask();
    setBackgroundPixmap(pixmap );
    setMask(bitmap);
}
离线jerychang
只看该作者 25楼 发表于: 2010-04-21
不能沉了,我得顶
QT HAO..
离线斯人
只看该作者 26楼 发表于: 2010-05-10
好东西谢谢分享...
离线哈目
只看该作者 27楼 发表于: 2010-08-16
是不是比较复杂的图形就不行了,用你的例子可以,换个复杂点的就不好使了
离线bluegoby
只看该作者 28楼 发表于: 2010-09-02
顶一下  有帮助。。。
离线zhqlike
只看该作者 29楼 发表于: 2010-12-22
my good
离线jonnystill7
只看该作者 30楼 发表于: 2011-01-09
如果作为背景图
QPixmap img("a.png");中的a.png带有透明的边框阴影效果的话,
似乎程序运行出来就是黑边。
一直不知道怎么解决。有人有办法么?
离线jwchen08
只看该作者 31楼 发表于: 2011-02-21
真是见识了!学习!
离线brinelee
只看该作者 32楼 发表于: 2011-03-16
纠结在窗口布局很久了
一切烦恼都是自寻烦恼,
一切问题都是时间问题。
离线hats1987

只看该作者 33楼 发表于: 2011-03-19
谢谢老大!
Qt 5.3.2
Win XP/7:  VC2010/ VC6 /Gcc 4.9.2
离线longteng9
只看该作者 34楼 发表于: 2011-07-27
setWindowOpacity ( qreal level ) 确实可行的,不过在unbuntu环境下,我的失去了效果,在xp下可以
关于setmask 俺有个问题请教,旋转了坐标系的时候(我用的是rotate函数)mask怎么跟着也旋转呢?很困扰我哦,好久没有解决呢 劳烦指教
离线sunvim

只看该作者 35楼 发表于: 2011-11-01
还是 不大好看 哈哈……
离线沙漠之源

只看该作者 36楼 发表于: 2011-12-03
谢谢LZ,学习并收藏之
快速回复
限100 字节
 
上一个 下一个