QT實現不規則窗體和透明窗體

源地址:http://www.cnblogs.com/little221/archive/2012/07/17/2595737.html

不規則窗體的實現有兩種方式:

一種是設置窗體的掩碼圖像;

另一種是設置窗體背景透明,然後重寫其繪圖函數,將背景圖繪製上去。

 

第一種方式

首先要準備兩張圖像,一張是要顯示的圖像,另一張是第一張圖的掩碼圖像,黑色部分是你的窗體要顯示的部分,如圖:

clip_image002 clip_image004

具體實現的關鍵代碼如下:

//IrregularForm1.h

IrregularForm1::IrregularForm1(QWidget *parent) :

    QWidget(parent)

{

    setWindowFlags(Qt::FramelessWindowHint);//設置窗體無邊框

    //設置背景

    QPixmap pixmap(":/pic.png");

    QPalette palette;

    palette.setBrush(backgroundRole(), QBrush(pixmap));

    setPalette(palette);

    //設置窗體的掩碼圖像,摳除圖像的白色區域實現不規則窗體

    QBitmap bitmap(":/picmask.png");

    setMask(bitmap);

}

運行效果不是特別完美,應該是我的掩碼圖像的問題,如圖:

clip_image002

這種方式有一個問題,就是當你的圖像特別不規則的時候,會有很明顯的鋸齒出現。之前做過一個卡通圖像就出現這個問題,解決的辦法是使用下面的第二種方法。

 

第二種方式

只需要準備一張圖片,透明部分將不會顯示,支持半透明。我這裏弄了一張背景透明,前景半透明的圖像,如圖:

clip_image008

具體實現的關鍵代碼如下:

//IrregularForm2.cpp

IrregularForm2::IrregularForm2(QWidget *parent) :

    QWidget(parent)

{

    this->setWindowFlags(Qt::FramelessWindowHint);//設置窗體無邊框

    this->setAttribute(Qt::WA_TranslucentBackground);//設置背景透明

    pic.load(":/IrregularPic.png");//加載圖像

    this->resize(pic.size());

}

//重寫繪圖事件

void IrregularForm2::paintEvent(QPaintEvent *)

{

    QPainter painter(this);

    painter.drawPixmap(0, 0, pic);//繪製圖像

}

效果截圖:

clip_image010

說到這裏,我們的不規則透明窗體雖然創建出來了,但是現在我們無法移動它了,現在我們就來實現左鍵拖動窗體的功能,首先要先聲明兩個變量,另外要重寫三個事件,代碼如下:

//IrregularForm1.h

class IrregularForm1 : public QWidget

{

    Q_OBJECT

public:

    explicit IrregularForm1(QWidget *parent = 0);

protected:

    QPoint oldPos;

    bool press;

    void mousePressEvent(QMouseEvent *event);

    void mouseMoveEvent(QMouseEvent *event);

    void mouseReleaseEvent(QMouseEvent *event);

};

關鍵的實現代碼(press變量在構造函數中初始化爲false):

//IrregularForm1.cpp

void IrregularForm1::mousePressEvent(QMouseEvent *event)

{

    if(event->button() == Qt::LeftButton)

    {

        oldPos = event->globalPos();

        press = true;

    }

}

void IrregularForm1::mouseMoveEvent(QMouseEvent *event)

{

    if (press)

    {

        this->move(this->pos() + event->globalPos() - oldPos);

        oldPos = event->globalPos();

    }

}

void IrregularForm1::mouseReleaseEvent(QMouseEvent *event)

{

    press = false;

}

這樣就實現不規則窗體的移動功能了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章