绘制不规则窗体

绘制一个不规则窗体(三角形、圆角矩形、椭圆)
  注:这里我会重写鼠标进入函数用于验证在绘制不规则窗体时,在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);
}
posted @ 2022-08-07 19:36  test369  阅读(53)  评论(0编辑  收藏  举报