Qt 不规则窗体编程

有些时候,为了创建个性化软件界面,往往需要各种形状的窗口,这就有别于传统的窗口了!那么,怎么处理类似的界面呢?我们可以通过继承QWidget、QDialog等类来派生新类,在新类中重新实现基类中的虚函数如:mousePressEvent、mouseMoveEvent、paintEvent。为什么要重新实现这些函数呢?因为不规则窗口不存在边框,如果想要通过鼠标来实现窗口位置变换、相应用户拖拽等动作的话,必须要实现这些过程。同理,重画函数也要重写,用以完成窗体上绘制图片的工作。

    代码实现:

    dialog.h

#ifndef DIALOG_H

#define DIALOG_H
 
#include <QDialog>
#include <QPoint>
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
Q_OBJECT
 
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
 
private:
Ui::Dialog *ui;
QPoint dragPosition;
protected:
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
 
};
 
#endif // DIALOG_H

    

    dialog.cpp

#include "dialog.h"

#include "ui_dialog.h"
#include <QBitmap>
#include <QPainter>
#include <QMouseEvent>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
QPixmap pixmap;
pixmap.load("./images/test.png",0,Qt::AvoidDither|
Qt::ThresholdAlphaDither|
Qt::ThresholdDither);//加载图片,并指明避免图片抖动模式
resize(pixmap.size());//重设窗口大小以图片大小为准
this->setMask(pixmap.mask());//为图片设定遮罩,被遮罩部分在运行的时候是透明的
}
 
Dialog::~Dialog()
{
delete ui;
}
 
void Dialog::mousePressEvent(QMouseEvent *event)
{
if (event->button()==Qt::LeftButton)//拦截点击左键动作
{
this->dragPosition = event->globalPos()
-this->frameGeometry().topLeft();//计算窗口起始位置并保存
event->accept();//默认处理过程
}
else if (event->button()==Qt::RightButton)//拦截单击右键动作
{
close(); //点击右键关闭程序
}
}
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)//拦截左键
{
move(event->globalPos()-this->dragPosition);//定位窗口新位置
event->accept();//默认处理过程
}
}
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,0,QPixmap("./images/test.png"));//重绘图片
}
 
程序运行效果如下:
 
 
当然,这个程序只绘制了界面,如果施加功能的话,需要在界面上添加各种可视部件,那可视部件
也可以用相似的办法处理的,关键是看你要实现什么样的界面!我的美术没有那么好,所以,估计需要
一位大师级的美工给我设计了。



from: http://blog.sina.com.cn/s/blog_6176b277010120ys.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值