在開發應用時有時彈窗需要居中顯示,但是窗口彈出後一般不是,而取消了標題欄,無法拖動,所以應使用如下方法使得窗口能夠拖動
轉載請註明出處。 https://blog.csdn.net/lwwl12/article/details/76448770
(C #)WinForm無邊框窗體實現雙擊縮放及拖動
在設計中經常需要移除默認邊框,並自定義軟件邊框,但是移除原始邊框後拖動又是一個問題。以下以代碼形式介紹如何實現QT窗口無邊框拖動。
先上個圖
上圖移除了默認的邊框,添加了border並設置了顏色,同時實現了全窗口的點擊拖動。
下面開始介紹如何實現:
一. 移除默認邊框/標題欄 在QWidget的構造函數中調用setWindowFlags隱藏標題欄
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
- 1
二. 設置窗口拖動
通過重寫mouseReleaseEvent、mousePressEvent、mouseMoveEvent三個函數來實現拖動,具體代碼如下:
//testWidget.h頭文件聲明三個函數,並聲明兩個屬性
//聲明三個鼠標事件函數
void mouseReleaseEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
//鼠標是否按下屬性
bool m_bPressed=false;
//按下後當前鼠標位置屬性
QPoint m_point;
//testWidget.cpp中重寫三個函數實現拖動
void testWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)//判斷左鍵是否按下
{
m_bPressed = true;
m_point = event->pos();
}
}
void testWidget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_bPressed = false;
}
void testWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_bPressed)
move(event->pos() - m_point + pos());//移動當前窗口
}
全部代碼:
//testWidget.h
#pragma once
#include <QWidget>
#include <QMouseEvent>
class testWidget: public QWidget
{
Q_OBJECT
public:
testWidget(QWidget *parent = 0);
bool m_bPressed = true;
QPoint m_point;
void mouseReleaseEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
};
//testWidget.cpp
#include "testWidget.h"
testWidget::testWidget(QWidget *parent) : QWidget(parent)
{
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
setFixedSize(100, 100); //設置窗口大小
}
void testWidget::mouseMoveEvent(QMouseEvent *event)
{
if (m_bPressed)
move(event->pos() - m_point + pos());
}
void testWidget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_bPressed = false;
}
void testWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_bPressed = true;
m_point = event->pos();
}
}