1. 程式人生 > 其它 >QT實現用全部窗體拖動視窗

QT實現用全部窗體拖動視窗

技術標籤:Qt的學習

本來要拖動視窗必須通過按住頂部的帶有最大化、最小化和退出按鍵的欄目才可以實現,現在我準備通過三個函式來實現按住窗體部分拖動整個視窗。具體思路是通過三個函式mousePressEvent、mouseMoveEvent和mouseReleaEvent,即“滑鼠按下事件”、“滑鼠拖動事件”和“滑鼠放開事件”三個函式來實現。首先先在標頭檔案裡定義如下幾個函式和一個退出部件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaEvent(QMouseEvent *e);

private:
    Ui::Widget *ui;
    QPushButton *bClose;
    QPoint last;
};
#endif // WIDGET_H

接著在.cpp檔案中一一實現這三個函式,如下所示:

#include "widget.h"
#include "./ui_widget.h"
#include "qmetatype.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->move(100,200);
    //this->setStyleSheet(("background:green"));
    this->setWindowTitle("去掉最大最小化按鈕");
    bClose = new QPushButton(this);
    bClose->setText("關閉");
    connect(bClose,SIGNAL(clicked()),this,SLOT(close()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent *e)
{
    last = e->globalPos();
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
    int dx=e->globalX()-last.x();
    int dy=e->globalY()-last.y();

    last=e->globalPos();

    move(x()+dx,y()+dy);
}

void Widget::mouseReleaEvent(QMouseEvent *e)
{
    int dx=e->globalX()-last.x();
    int dy=e->globalY()-last.y();

    move(x()+dx,y()+dy);
}
最後點選編譯執行即可,出來的視窗就可以通過按住窗體(最大的部分)來拖動了視窗了!!!