常见的窗体都是方形的,有时候也需要其他形状的窗体,Qt实际上也支持的,可以通过setMask()为窗设置遮罩,实现不规则窗体,遮罩后的窗口大小还是原来的,只是被遮罩的地方看不见了,变成透明的而已。
具体实现代码如下:
shapewiget.h 代码
#ifndef SHAPEWIGET_H
#define SHAPEWIGET_H
#include
class ShapeWiget : public QWidget
{
Q_OBJECT
public:
ShapeWiget(QWidget *parent = 0);
~ShapeWiget();
protected:
void paintEvent(QPaintEvent *);
signals:
public slots:
private:
QPoint dragPosition;
};
#endif // SHAPEWIGET_H
shapewiget.cpp 代码
#include "shapewiget.h"
#include
#include
#include
#include
#include
ShapeWiget::ShapeWiget(QWidget *parent)
: QWidget(parent)
{
//新建一个QPixmap对象
QPixmap pix;
// 加载一个需要的图片遮罩
pix.load("dialog.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
resize(pix.size());
// 为调用它的控件增加一个遮罩,遮住所选的区域以外的部分使之看起来是透明的
setMask(QBitmap(pix.mask()));
QLabel *label1 = new QLabel("test1", this);
QLabel *label2 = new QLabel("test2", this);
QLabel *label3 = new QLabel("test3", this);
QLabel *label4 = new QLabel("test4", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setContentsMargins(50, 30, 0, 20);
layout->addWidget(label1);
layout->addWidget(label2);
layout->addWidget(label3);
layout->addWidget(label4);
setFixedSize(128, 128);
}
// 重写重绘事件
void ShapeWiget::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.drawPixmap(0,0,QPixmap("16.png"));
}
ShapeWiget::~ShapeWiget()
{
}
然后再MainWindow中添加如下代码:
setWindowTitle(tr("Main Window"));
ShapeWiget *dw = new ShapeWiget(this);
setCentralWidget(dw);
setFixedSize(400, 600);
QPalette palette;
palette.setColor(QPalette::Background, QColor(64, 66, 68));
this->setAutoFillBackground(true);
this->setPalette(palette);
}
运行可达到如下效果