Qt界面設置無邊框之后如何實現縮放界面-創新互聯

在qt中,如果設置的了窗口無邊框的話(即setWindowFlag(Qt::FramelessWindowHint);)那么窗口就沒法直接被鼠標拖動了,也沒法按住窗口的邊界進行縮放。

成都創新互聯是一家專業提供曲靖企業網站建設,專注與網站建設、做網站、H5建站、小程序制作等業務。10年已為曲靖眾多企業、政府機構等服務。創新互聯專業的建站公司優惠進行中。

如果要實現縮放和拖動,一般來說就需要的重寫窗口類的mousePressEvent和mouseMoveEvent事件。

但是有些時候,比如在界面上放了一個QgraphicsView,主界面就沒法響應mousePressEvent和mouseMoveEvent事件。因為該事件被QgraphicsView截取了。這個時候我們就不能簡單得通過的重寫主窗口的鼠標事件來實現窗口的拖動和縮放了。

我是這樣實現的:

如下圖所示,我在界面上放了4個qlabel,通過qlabel的raise()方法將他們置頂,這樣,這些label就能獲取到鼠標移動和點擊事件了。

但是,我們是不能直接重寫qlabel中的鼠標事件響應函數的,因為在qlabel中,鼠標事件的級別是protected,如下圖:

所以這時候就需要我們自己寫一個類,繼承qlabel,代碼如下:

Mylabel.h

本文福利,莬費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT信號與槽機制,QT界面開發-圖像繪制,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊莬費領取↓↓

#ifndef MYLABEL_H
#define MYLABEL_H

#include#include#include#include#includeclass myLabel:public QLabel
{
    Q_OBJECT
public:
    myLabel(QWidget *parent=nullptr);
    void setScaleCursor(int nshape = 0);
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);
    QPoint m_mousePointOld;
    bool m_bKeepDrag;
signals:
    void moveEventSig(QPoint point);
    void mouseReleasedSig();
};

#endif // MYLABEL_H

Mylabel.cpp

#include "mylabel.h"

myLabel::myLabel(QWidget *parent):m_bKeepDrag(false)
{
    this->setParent(parent);
}

void myLabel::setScaleCursor(int nshape)
{
    if(nshape == 1)//左右拉伸
    {
        setCursor(Qt::SizeHorCursor);   //改變光標形狀
    }
    else if(nshape == 2)//上下拉伸
    {
        setCursor(Qt::SizeVerCursor);
    }
    else if(nshape == 3)//右下拉伸
    {
        setCursor(Qt::SizeFDiagCursor);
    }
    else //正常顯示
    {
        setCursor(Qt::ArrowCursor);
    }

}

void myLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        m_bKeepDrag = true;
        m_mousePointOld = ev->globalPos();
    }
}

void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
   if(m_bKeepDrag)
   {
       const QPoint position = ev->globalPos() - m_mousePointOld; //the position of mainfrmae + (current_mouse_position - last_mouse_position)
           //move(position.x(), position.y());
       emit moveEventSig(position);
       m_mousePointOld = ev->globalPos();
   }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    m_bKeepDrag = false;
    emit mouseReleasedSig();
}

在主界面的類中主要代碼如下:
頭文件里面定義這4個label

1     myLabel          *labelLft;
2     myLabel          *labelRit;
3     myLabel          *labelBot;
4     myLabel          *labelTop;

在cpp文件的構造函數中初始化這4個label,同時通過connect的方式建立信號槽,將label中的鼠標移動事件傳給主窗口,從而控制主窗口邊界的縮放

//上下左右的label,為了控制界面能夠拖動拉伸
labelLft = new myLabel(this);
labelLft->setStyleSheet("QLabel {background-color: transparent;}");//設置背景透明
labelLft->raise();
labelLft->setScaleCursor(1);
connect(labelLft,&myLabel::moveEventSig,this,&MaxPicShowForm::getLeftScaleEvent);
labelRit = new myLabel(this);
labelRit->setStyleSheet("QLabel {background-color: transparent;}");//設置背景透明
labelRit->raise();
labelRit->setScaleCursor(1);//設置為左右拉升光標
connect(labelRit,&myLabel::moveEventSig,this,&MaxPicShowForm::getRightScaleEvent);
labelBot = new myLabel(this);
labelBot->setStyleSheet("QLabel {background-color: transparent;}");//設置背景透明
labelBot->raise();
labelBot->setScaleCursor(2);//設置為上下拉升光標
connect(labelBot,&myLabel::moveEventSig,this,&MaxPicShowForm::getBottomScaleEvent);
labelTop = new myLabel(this);
labelTop->setStyleSheet("QLabel {background-color: transparent;}");//設置背景透明
labelTop->setScaleCursor(2);//設置為上下拉升光標
connect(labelTop,&myLabel::moveEventSig,this,&MaxPicShowForm::getTopScaleEvent);
labelRB = new myLabel(this);
labelRB->setStyleSheet("QLabel {background-color: transparent;}");//設置背景透明
labelRB->setScaleCursor(3);//設置為右下拉升光標
connect(labelRB,&myLabel::moveEventSig,this,&MaxPicShowForm::getRBScaleEvent);
//設置4個label的位置:
labelLft->setGeometry(0,0,5,this->height());
labelRit->setGeometry(this->width()-5,0,5,this->height());
labelBot->setGeometry(0,this->height()-5,this->width(),5);
labelTop->setGeometry(0,0,this->width(),5);

響應鼠標拖動事件:

1 void MaxPicShowForm::getLeftScaleEvent(QPoint movPoint)
 2 {
 3     if((pos().x()+movPoint.x())>(pos().x()+this->width()-200))
 4     {
 5         return;//保證拖動窗口左邊界的時候,控件寬度至少有200
 6     }
 7     this->setGeometry(pos().x()+movPoint.x(),pos().y(),this->width()-movPoint.x(),this->height());
 8 }
 9 
10 void MaxPicShowForm::getRightScaleEvent(QPoint movPoint)
11 {
12     if((pos().x()+this->width()+movPoint.x())<(pos().x()+200))
13     {
14         return;//保證拖動窗口右邊界的時候,控件寬度至少有200
15     }
16     this->setGeometry(pos().x(),pos().y(),this->width()+movPoint.x(),this->height());
17 }
18 
19 void MaxPicShowForm::getBottomScaleEvent(QPoint movPoint)
20 {
21     if((pos().y()+this->height()+movPoint.y())<(pos().y()+200))
22     {
23         return;//保證拖動窗口下邊界的時候,控件高度至少有200
24     }
25     this->setGeometry(pos().x(),pos().y(),this->width(),this->height()+movPoint.y());
26 }
27 
28 void MaxPicShowForm::getTopScaleEvent(QPoint movPoint)
29 {
30     if((pos().y()+movPoint.y())>(pos().y()+this->height()-200))
31     {
32         return;//保證拖動窗口上邊界的時候,控件高度至少有200
33     }
34     this->setGeometry(pos().x(),pos().y()+movPoint.y(),this->width(),this->height()-movPoint.y());
35 q}

本文福利,莬費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT信號與槽機制,QT界面開發-圖像繪制,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊莬費領取↓↓?

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

本文題目:Qt界面設置無邊框之后如何實現縮放界面-創新互聯
分享網址:http://m.kartarina.com/article22/ccghjc.html

成都網站建設公司_創新互聯,為您提供建站公司面包屑導航軟件開發域名注冊網站維護自適應網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 国产自无码视频在线观看| 日本无码WWW在线视频观看| 无码人妻一区二区三区av| 无码夜色一区二区三区| 无码国内精品久久人妻麻豆按摩 | 成人午夜精品无码区久久| 国产成人无码免费网站| 久久久久亚洲AV片无码| 亚洲国产精品无码久久久久久曰 | 亚洲国产精品成人精品无码区在线| 少妇无码一区二区二三区| 精品少妇人妻AV无码专区不卡 | 精品无码久久久久久国产| 无码专区天天躁天天躁在线| 国产精品国产免费无码专区不卡| 亚洲AV无码久久寂寞少妇| 无码不卡亚洲成?人片| 最新中文字幕av无码专区| 久久无码av三级| 天码av无码一区二区三区四区| 亚洲毛片无码专区亚洲乱| 国产成人无码一区二区三区在线 | 精品久久久久久无码人妻中文字幕 | 精品高潮呻吟99av无码视频| 国产成人无码一区二区三区在线| 蜜臀亚洲AV无码精品国产午夜.| 精品国产一区二区三区无码| 亚洲国产成人片在线观看无码| 久久久精品无码专区不卡| 无码乱码观看精品久久| 日韩激情无码免费毛片| 亚洲精品无码av中文字幕| 精品人妻系列无码一区二区三区| 精品无码一区二区三区爱欲| 国产精品无码AV一区二区三区| 亚洲av永久无码精品表情包| 亚洲Av综合色区无码专区桃色| 夜夜添无码一区二区三区| 国产成人午夜无码电影在线观看| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲高清无码综合性爱视频|