日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt實現不規則窗體

作者:xbcdzz 更新時間: 2022-07-30 編程語言

常見的窗體通常是各種各樣方形的對話框,但有時候也需要使用非方形的對話框。如圓形、橢圓形、甚至一些不規則形狀的對話框。

利用setMask()函數為窗體設置遮罩,實現不規則窗體。設置遮罩后的窗體尺寸仍是原窗體大小,只是被這照的地方不可見。

案例:

不規則窗體的實現方法。具體實現一塊水晶石圖形外沿形狀的不規則形狀對話框,也可以在不規則窗體上放置按鈕等控件,可以通過鼠標左鍵拖拽窗體,右擊鼠標關閉窗體,運行效果如下:

實現步驟如下:

(1)建立項目“ShapeWidget”,基類選擇“QWidget”,類名為“widget",取消“創建界面”復選框的選中狀態。

(2)不規則窗體類ShapeWidget繼承QWidget類,為了使不規則窗體能夠通過鼠標隨意拖拽,在該類中重定義了鼠標事件函數mousePressEvent()、mouseMoveEvent()及重繪函數paintEvent()。

protected:
    void mouseMoveEvent(QMouseEvent *);
    void mousePressEvent(QMouseEvent *);
    void paintEvent(QPaintEvent *);

private:
    QPoint dragPosition;

注意添加頭文件

#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>

(3)widget.cpp的構造函數部分是實現不規則窗體的關鍵,具體代碼如下:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QPixmap pix;
    /* 調用QPixmap的load()函數為QPixmap對象填入圖象值 */
    pix.load("D:/QT/QT_blog/ShapeWidget/24.png",0,Qt::AvoidDither|Qt::ThresholdAlphaDither|Qt::ThresholdDither);
    resize(pix.size()); //設置主窗體的尺寸為所讀取的圖片的大小
    setMask(QBitmap(pix.mask()));
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{

    if(event->buttons()&Qt::LeftButton)
    {
        move(event->globalPos()-dragPosition);
        event->accept();
    }
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        dragPosition = event->globalPos()-frameGeometry().topLeft();
        event->accept();
    }
    if(event->button() == Qt::RightButton)
    {
        close();
    }
}
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,QPixmap("D:/QT/QT_blog/ShapeWidget/24.png"));
}
Widget::~Widget()
{
}

其中,

(a)load()函數原型:?

bool load(const QString& fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor);

參數fileName為圖片文件名;參數format表示讀取圖片文件采用的格式,此處為0,表示采用默認格式;參數flags表示讀取圖片的方式,由Qt::ImageConversionFlags定義,此處設置的標識為避免圖片抖動方式。

(b)setMask(QBitmap(pix.mask())):為調用他的控件增加一個遮罩,遮住所選區域以外的部分使其看起來是透明的,它的參數可為一個QBitmap對象或者一個QRegion對象,此處調用QPixmap的mask()函數用于獲得圖片自身的遮罩,為一個QBitmap對象,實例中用的是PNG格式的圖片,它的透明部分實際上是一個遮罩。

? ? ? ?使不規則窗體能夠響應鼠標事件、隨意拖曳的函數,是重定義的鼠標按下響應函數mousePressEvent(QMouseEvent *),首先判斷按下的是否為鼠標左鍵。若是,則保存當前鼠標點所在的位置相對于窗體左上角的偏移值drgPosition;若按下的是鼠標石鍵,則關團窗體。

? ? ? 鼠標移動響應函數mouseMoveEvent(QMouseEvent*),首先判斷當前鼠標狀態,調用even->
buttons()返回鼠標的狀態,若為左鍵則調用QWidget的move()函數將窗體移動至鼠標當前點。
由于move)函數的參數指的是窗體的左上角的位置,因此要使用鼠標當前點的位置減去相對窗
體左上角的偏移值dragPosition。

? ? ? ?重繪函數paintEvent()主要完成在窗體上繪制圖片的制作。此處為方便顯示在窗體上,所繪制的是用來確定窗體外形的PNG圖片。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

原文鏈接:https://blog.csdn.net/m0_60440984/article/details/126022703

欄目分類
最近更新