moc 发表于 2018-12-1 14:22:12

Qt-011不规则窗体

常见的窗体是各种方形的对话框,但有时候也需要非方形的窗体,如圆形,椭圆甚至是不规则形状的对话框。
实现步骤:
1. 新建一个项目比如项目名称叫做“ShapeWidget”,给此项目添加一个类“ShapeWidget”,基类选择“QWidget”。
2. 为了使该不规则窗体可以通过鼠标随意拖拽, 在类中重定义鼠标事件:mousePressEvent()、mouseMoveEvent()、以及绘制函数paintEvent().
3. “ShapeWidget”的构造函数部分是实现该不规则窗体的关键,添加具体代码如下:
//新建一个Pixmap对象
    QPixmap pixmap;
    //加载图片
    pixmap.load(":/new/prefix1/image/sunny.png");
   //固定窗口大小,将窗口大小设置为图片大小
    setFixedSize( pixmap.width(), pixmap.height() );
    //给窗口去掉边框,设置窗口的flags
    setWindowFlags(Qt::FramelessWindowHint | windowFlags() );
    //设置透明背景
    setAttribute(Qt::WA_TranslucentBackground);4. 重新实现鼠标事件和绘制函数
void ShareWidget::mousePressEvent(QMouseEvent *ev)
{
        if(ev->button() == Qt::LeftButton)
        {
                  // 求出窗口移动之前的坐标
                  m_dragPoint = ev->globalPos()-frameGeometry().topLeft();
        }
        if(ev->button() == Qt::RightButton)
        {
                  // 鼠标右键关闭窗口
                  close();
        }
}

void ShareWidget::mouseMoveEvent(QMouseEvent *ev)
{
        if(ev->buttons() & Qt::LeftButton)
        {
          // 如果是鼠标左键拖动, 移动窗口
          move(ev->globalPos() - m_dragPoint);
        }
}

void ShareWidget::paintEvent(QPaintEvent *ev)
{
        Q_UNUSED(ev)
        QPainter painter(this);
        // 重新绘制图片
        painter.drawPixmap(0, 0, QPixmap(":/ButterFly"));
}

My_A 发表于 2019-4-3 21:29:51

666
终于看懂了
{:5_91:}
页: [1]
查看完整版本: Qt-011不规则窗体