不規則窗體的實現有兩種方式:
一種是設置窗體的掩碼圖像;
另一種是設置窗體背景透明,然后重寫其繪圖函數,將背景圖繪制上去。
第一種方式:
首先要准備兩張圖像,一張是要顯示的圖像,另一張是第一張圖的掩碼圖像,黑色部分是你的窗體要顯示的部分,如圖:
具體實現的關鍵代碼如下:
//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); } |
運行效果不是特別完美,應該是我的掩碼圖像的問題,如圖:
這種方式有一個問題,就是當你的圖像特別不規則的時候,會有很明顯的鋸齒出現。之前做過一個卡通圖像就出現這個問題,解決的辦法是使用下面的第二種方法。
第二種方式:
只需要准備一張圖片,透明部分將不會顯示,支持半透明。我這里弄了一張背景透明,前景半透明的圖像,如圖:
具體實現的關鍵代碼如下:
//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);//繪制圖像 } |
效果截圖:
說到這里,我們的不規則透明窗體雖然創建出來了,但是現在我們無法移動它了,現在我們就來實現左鍵拖動窗體的功能,首先要先聲明兩個變量,另外要重寫三個事件,代碼如下:
//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; } |
這樣就實現不規則窗體的移動功能了。
附件:
源碼IrregularForm.zip
下載地址:
http://pan.baidu.com/share/link?shareid=135850&uk=3238766853