绘制不规则窗体
绘制一个不规则窗体(三角形、圆角矩形、椭圆)
注:这里我会重写鼠标进入函数用于验证在绘制不规则窗体时,在Qt中是否只是简单的把不需要的部分遮住,
而遮住部分的某些事件是否受影响呢?(这里主要验证鼠标进入事件);结论:给我打感觉就像是把多余的部分
减掉一样,就是说遮住的部分也就失去了对应的事件。如下代码的实现:只有在鼠标进入三角形区域后
cout 才会有输出。
技术点:
1.去掉标题栏
2.绘制不规则窗体
.h文件
class Widget:public QWidget
{
public:
Widget(QWidget *parent = nullptr);
protected:
virtual void enterEvent(QEvent *event) override
{
cout << "enter Widget";
}
};
.cpp文件
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
this->setWindowFlags(Qt::FramelessWindowHint); // 去掉标题栏.
this->resize(150,150);
this->setStyleSheet("background-color:red;");
#if 1
// 绘制自定义形状的窗口
QBitmap bitMap(this->width(),this->height()); // 定义一个窗口大小的位图
bitMap.fill(); // 填充整个位图
QPainter painter(&bitMap); // 定义绘图设备
painter.setBrush(Qt::black); // 必须定义为黑色,不知道为啥,知道的麻烦在评论区说一下
painter.setPen(Qt::NoPen); // 只能为黑色或者不设置画笔
painter.setRenderHint(QPainter::Antialiasing);// 反走样
// painter.drawRoundedRect(bitMap.rect(),30,30); // 绘制圆角矩形
// painter.drawEllipse(bitMap.rect()); // 绘制椭圆
QPainterPath path;
//倒三角形
path.moveTo(0,0);
path.lineTo(bitMap.width(),0);
path.lineTo(bitMap.width()/2,bitMap.height());
path.lineTo(0,0);
painter.drawPath(path); // 绘制三角形
setMask(bitMap); // 将圆角作为遮罩
//正三角形
/*
path.moveTo(bitMap.width()/2, 0);
path.lineTo(bitMap.width(), bitMap.height());
path.lineTo(0,bitMap.height());
path.lineTo(bitMap.width()/2, 0);
painter.drawPath(path);
setMask(bitMap);
*/
setMask(bitMap);
#else
// 绘制图片形状的窗口切使用图片
QPixmap pixmap(":/jidelogo.png");
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(pixmap));
setPalette(palette);
resize(pixmap.size());
setMask(pixmap.mask());
#endif
// this->move(300,300);
}