QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3103|回复: 12

Qt Designer快速开发不规则窗体

[复制链接]
发表于 2004-4-3 20:19:52 | 显示全部楼层 |阅读模式
首相准备两个图。一个是要显示在窗体的图片,一个是蒙板,蒙板的黑色部分是要保留的,白色是要去掉的。
我准备了2张图,要显示的图片是"tmp.png",蒙板是"mask.png".如图.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2004-4-3 20:22:58 | 显示全部楼层
好,先建立一个目录,叫mask。把图片拷贝到下面去。打开Qt Designer,新建一个工程。点击Project File后面的
[...]把工程保存到mask目录下去,单击OK。

新建一个Widget构件,单击OK,再保存到mask目录下去

选择Object Explorer的Members页面,(在右边)
找到Includes (in Implementation)
点击右键,选择Edit,点击Add.输入<qpixmap>回车.在点击Add.输入<qbitmap>回车.如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-4-3 20:25:54 | 显示全部楼层
找到Forward Declarations(还是在Members页面)
点击右键,选择Edit,用上面同样的方法添加
class QPixmap;
class QBitmap;

找到Functions,在private点击右键,选择New(添加函数)在Function:后面输入init(),Specifier:
选择non virtual,其他不变点击OK.这样private下多了一个init()(Constructor),单击它,会出现一个对话框,
点击Yes.会出现一个编辑页面。在init()加入:

//------------------------------------------------------------
        QPixmap tmpPixmap("tmp.png");//要显示在Widget的图片
        QBitmap maskBitmap("mask.png");//蒙板图片
       
        setFixedSize(tmpPixmap.size());//设定Widget的大小
        setPaletteBackgroundPixmap (tmpPixmap) ;//用tmpPixmap作为背景图片
        setMask(maskBitmap); //设定蒙板片
//------------------------------------------------------------

这样窗口就是不规则的了。但是窗口是不能移动的。下面我要窗口移动!
按照上面的办法在Includes (in Implementation)添加<qpoint>.在Forward Declarations添加class QPoint;
在Functions的protected下添加两个函数mouseMoveEvent( QMouseEvent * e ),mousePressEvent( QMouseEvent * e )(其实是重载Widget的鼠标事件,细节请看qt的帮助),在Class Variables的private下添加QPoint oldPos;
在mouseMoveEvent函数下加入:
//------------------------------------------------------------
        if(e->state()==LeftButton)//是不是左键
        {
                QPoint tmpPos;
                tmpPos=e->pos();//获得鼠标的位置
                tmpPos=pos()+(tmpPos-oldPos);//计算新位置
                move(tmpPos);//设定新位置
        }
//------------------------------------------------------------
在mousePressEvent下加入:
//------------------------------------------------------------
        oldPos=e->pos();//保存鼠标按下的位置
//------------------------------------------------------------
好了,新建一个main.cpp吧,选择File->new建立一个main.cpp单击OK后,选择Form1


编译吧!保存所以的内容。在mask目录下运行
qmake -o Makefile mask
编译
make
运行
./mask

结果如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-4-3 20:29:19 | 显示全部楼层
这是源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2004-4-4 20:56:17 | 显示全部楼层
谢谢继续学习中
回复

使用道具 举报

发表于 2004-4-8 23:49:45 | 显示全部楼层
gtk+/gtk2.0应该也可以做到。
回复

使用道具 举报

发表于 2005-6-27 13:33:45 | 显示全部楼层
好极了,对我帮助很大啊.
可以做个图像按钮了,交流一下啊
回复

使用道具 举报

发表于 2005-7-22 18:20:16 | 显示全部楼层
是的,gtk+2.0 实现这个不规则窗口效果也是很简单的,过些时我也整理一段代码献丑供大家参考批评指正一哈。
回复

使用道具 举报

发表于 2005-7-23 08:53:02 | 显示全部楼层
[quote:df06cfd1a4="dolphin2000"]是的,gtk+2.0 实现这个不规则窗口效果也是很简单的,过些时我也整理一段代码献丑供大家参考批评指正一哈。 [/quote]
:D 拿出来看看,我一直找不到相关的资料....
回复

使用道具 举报

发表于 2005-7-23 11:42:58 | 显示全部楼层
gtk_widget_shape_combine_mask
回复

使用道具 举报

发表于 2006-2-20 22:36:03 | 显示全部楼层
文章收藏了,有一个问题:生成的拖动图片经过网页图片或别的软件图片界面时抖动地厉害,mplayer播放器却很稳当(GTK写的吧),所以想知道mplayer实现播放器界面这里面还有什么技巧。
回复

使用道具 举报

发表于 2006-2-21 12:58:40 | 显示全部楼层
[quote:24a401c488="haulm"]文章收藏了,有一个问题:生成的拖动图片经过网页图片或别的软件图片界面时抖动地厉害,mplayer播放器却很稳当(GTK写的吧),所以想知道mplayer实现播放器界面这里面还有什么技巧。[/quote]

难道你没有听过什么叫做双缓冲?
回复

使用道具 举报

发表于 2006-2-21 14:24:14 | 显示全部楼层
我是初学者,谢谢提示。
另外我按这篇文章手工写了界面程序,只是该程序只能在命令行运行,如果在KDE下双击运行的话,窗体还是四方的,何解?
我找了很多资料了,苦无结果,我把代码贴出来,希望能得到指点:
[code:1]
#include <qapplication.h>
#include <qwidget.h>
#include <qpixmap.h>
#include <qbitmap.h>
#include <qpoint.h>

class myclass:public QWidget
{
        public:
                myclass(QWidget *parent = 0, const char *name = 0 );
        protected:
                void mouseMoveEvent(QMouseEvent *e);
                void mousePressEvent(QMouseEvent *e);
        private:
                QPixmap *pixmap;
                QBitmap *bitmap;
                QPoint oldpos;
};
myclass::myclass(QWidget *parent, const char *name)
        : QWidget( parent, name,
                        Qt::WStyle_Customize | Qt::WStyle_NoBorder)
{
        setMaximumSize(120,120);
        setMinimumSize(120,120);
        move(300,300);
        pixmap=new QPixmap("tmp.png");
        bitmap=new QBitmap("mask.png");
        setPaletteBackgroundPixmap(*pixmap);
        setBackgroundOrigin( QWidget::WindowOrigin );
        setMask(*bitmap);
                if ( autoMask() ){
                updateMask();}

}

void myclass::mouseMoveEvent(QMouseEvent *e)
{
        if(e->state()==LeftButton)
        {
                QPoint tmppos;
                tmppos=e->pos();
                tmppos=pos()+(tmppos-oldpos);
                move(tmppos);
        }
}
void myclass::mousePressEvent(QMouseEvent *e)
{
        oldpos=e->pos();
}
int main(int argc,char *argv[])
{
        QApplication a(argc,argv);
        myclass w;
        a.setMainWidget(&w);
       
        w.show();
        return a.exec();
}

[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 22:28 , Processed in 0.070810 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表