1. 程式人生 > >QT自定義視窗(無邊框,自由拖動)

QT自定義視窗(無邊框,自由拖動)

做專案中為了美觀,很少使用QT自帶的標題欄,取消邊框,自己實現邊框。自定義視窗,主要通過滑鼠事件實現。重寫QT視窗事件,具體參考程式碼註釋。

#ifndef CUSTOMWINDOW_H
#define CUSTOMWINDOW_H

#include <QtGui/QDialog>


class CustomWindow : public QDialog
{
	Q_OBJECT

public:
	CustomWindow(QWidget *parent = 0);
	~CustomWindow();
protected:
	virtual void mousePressEvent(QMouseEvent *event);
	virtual void mouseMoveEvent(QMouseEvent *event);
	virtual void mouseReleaseEvent(QMouseEvent *event);

private:
	bool		mMoveing;
	QPoint	    mMovePosition;
};

#endif // CUSTOMWINDOW_H

#include "customwindow.h"
#include <QtGui/QMouseEvent>
#include <QtGui/QApplication>

CustomWindow::CustomWindow(QWidget *parent)
{
	mMoveing=false;
	//Qt::FramelessWindowHint 無邊框
    //Qt::WindowStaysOnTopHint 視窗在最頂端,不會拖到工作列下面
	setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint |Qt::WindowStaysOnTopHint);
	this->setStyleSheet("QDialog{border:2px solid green;}");
}
CustomWindow::~CustomWindow()
{}

//重寫滑鼠按下事件
void CustomWindow::mousePressEvent(QMouseEvent *event)
{
	mMoveing = true;
	//記錄下滑鼠相對於視窗的位置
	//event->globalPos()滑鼠按下時,滑鼠相對於整個螢幕位置
	//pos() this->pos()滑鼠按下時,視窗相對於整個螢幕位置
	mMovePosition = event->globalPos() - pos();
	return QDialog::mousePressEvent(event);
}

//重寫滑鼠移動事件
void CustomWindow::mouseMoveEvent(QMouseEvent *event)
{
	//(event->buttons() && Qt::LeftButton)按下是左鍵
	//滑鼠移動事件需要移動視窗,視窗移動到哪裡呢?就是要獲取滑鼠移動中,視窗在整個螢幕的座標,然後move到這個座標,怎麼獲取座標?
	//通過事件event->globalPos()知道滑鼠座標,滑鼠座標減去滑鼠相對於視窗位置,就是視窗在整個螢幕的座標
	if (mMoveing && (event->buttons() && Qt::LeftButton)
		&& (event->globalPos()-mMovePosition).manhattanLength() > QApplication::startDragDistance()) 
	{  
		move(event->globalPos()-mMovePosition);
		mMovePosition = event->globalPos() - pos();
	}
	return QDialog::mouseMoveEvent(event);
}
void CustomWindow::mouseReleaseEvent(QMouseEvent *event)
{
	mMoveing = false;
}

效果如下圖:



qt版本:4.8.6,開發環境:vs2010  安裝外掛 qt-opensource-windows-x86-vs2010-4.8.6.exe  qt-vs-addin-1.1.10.exe
技術在於交流、溝通,轉載請註明出處並保持作品的完整性。 作者:程式人生