Qt学习之路九——不规则窗体

我们通常看到见的窗体都是长方形的窗体,但是有时候我们也会需要用到不规则的窗体,所以我们也需要知道怎么创建一个不规则的窗体。

首先创建一个项目,基类选择QWidget,这次我们不勾选创建界面。因为我们需要使用鼠标拖动窗口移动,所以我们需要重写鼠标事件,同时我们还需要用到绘图事件。

我们首先需要在这个类的构造函数中创建一个QPixmap对象,然后使用load函数为这个对象填入图像值,这个图像就是整个窗口。

然后我们将主窗口的尺寸设置为这个图片的尺寸。最后我们只需要给这个图片加一个遮罩,让遮住区域以外的部分看起来是透明的。

现在我们来看看具体的代码

1、创建一个Qpixmap对象,并为其添加图像值,设置窗体的尺寸,添加遮罩

QPixmap pix;//创建一个QPixmap对象
/*
 * 调用pix的load函数为QPixmap对象填入图像值
 * 参数的含义
 * 1、图片的文件名
 * 2、读取图片文件的格式 0表示采用默认格式
 * 3、表示读取图片的方式 这里表示的是避免图片抖动
 */
pix.load("16.png", 0, Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);

resize(pix.size());//重新设置主窗体的尺寸,尺寸为图片的尺寸

/*
 * 为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的
 * 它的参数是一个QBitmap对象或者是一个QRegion对象
 */
setMask(QBitmap(pix.mask()));

2、重写鼠标按下响应函数,判断是鼠标哪个键被按下,如果是左键被按下,就记录下鼠标当前位置相对于窗体左上角的偏移量,如果是右键被按下,就关闭这个窗口

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();
    }
    if(event->button() == Qt::RightButton)
    {
        close();
    }
}

3、重写鼠标移动响应函数,首先还是判断鼠标的状态,如果是左键就调用move函数来移动窗口至鼠标当前点。

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        move(event->globalPos() - dragPosition);
        event->accept();
    }
}
4、重画函数
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,QPixmap("16.png"));
}

最后程序出来的结果就是这样的一个窗口


我们使用鼠标拖拽它到任意位置,右击就可以关闭这个窗口了。


猜你喜欢

转载自blog.csdn.net/y____xiang/article/details/80483738