2017-09-16 34 views
2

我是Qt的初學者,我想用自己的自定義titleBar(QLabel)拖動和移動窗口。如何在Qt中使用自定義標題欄移動窗口

的Qt代碼:

void MainWindow::mousePressEvent(QMouseEvent *event) 
{ 
    mpos = event->pos(); 
} 

void MainWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) 
    { 
     QPoint diff = event->pos() - mpos; 
     QPoint newpos = this->pos() + diff; 
     this->move(newpos); 
    } 
} 

此代碼允許我用鼠標按下任何QWidget的移動窗口,但我想通過鼠標壓在QLabel移動窗口。

+0

QLable是QWidget的一個驅動類,你可以安裝事件或erimplement Qlabel CALSS來回定製類和代碼mouseMoveEvent – saeed

回答

1

我建議你使用eventFilter獲得事件MousePressMouseRelease

void MainApp::mousePressEvent(QMouseEvent *event) 
{ 
    current = event->pos(); 
} 

void MainApp::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(pressed) 
     this->move(mapToParent(event->pos() - current)); 
} 

bool MainApp::eventFilter(QObject *object, QEvent *event) 
{ 
    if (object == ui->label && event->type() == QEvent::MouseButtonPress) 
    { 
     pressed = true; 
     return true; 
    } 
    if (object == ui->label && event->type() == QEvent::MouseButtonRelease) 
    { 
     pressed = false; 
     return true; 
    } 
    else 
     return false; 
} 

這是你的問題的示例項目上github download here.

+0

它的全面工作,但在鼠標按下,窗口跳躍......你能解決這個問題。 –

+0

@ManishPrajapati我通過使用QLabel的位置來修復它。 – aghilpro

+0

@ManishPrajapati如果我的回答對你有幫助接受答案或upvote它,謝謝。 – aghilpro

1

您可以重新實現QLabel類和穿刺mousePressEvent

例子:

頭文件

#ifndef MYLABLE_H 

#define MYLABLE_H 

#include <QEvent> 
#include <QObject> 
#include <QLabel> 

class MyLable : public QLabel 
{ 
    Q_OBJECT 
public: 
    explicit MyLable(QWidget *parent = 0); 

    QPoint mpos; 

signals: 

public slots: 



    // QWidget interface 
protected: 
    void mousePressEvent(QMouseEvent *); 
}; 

#endif // MYLABLE_H 

的.cpp

#include "mylable.h" 

#include <QMouseEvent> 

MyLable::MyLable(QWidget *parent) : QLabel(parent) 
{ 
} 

void MyLable::mousePressEvent(QMouseEvent * event) 
{ 
    if (event->buttons() & Qt::LeftButton) 
    { 
     QPoint diff = event->pos() - mpos; 
     QPoint newpos = this->pos() + diff; 
     this-> parentWidget()->move(newpos); 
    } 
} 
+0

我已經使用了三個標籤,可以爲三個標籤工作這個類... –

+0

當然,你可以讓任何瞬間,你想 – saeed

相關問題