qt 窗口无标题在桌面移动,不可移出可视范围之外

下面是基类的源代码,把所需求移动的窗口类继承这个基类即可

头文件:

/************************************************************************/
/*BaseWidget.h                                                          */
/************************************************************************/

#ifndef BASEWIDGET_H
#define BASEWIDGET_H

#include <QWidget>

class BaseWidget : public QWidget
{
	Q_OBJECT

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

	bool m_moving;//用来标记是否鼠标移动
	QPoint m_offset;
private:
};

#endif // BASEWIDGET_H

CPP文件:

/************************************************************************/
/* BaseWidget.cpp                                                       */
/************************************************************************/

#include "BaseWidget.h"
#include <QMouseEvent>
#include <QDesktopWidget>
#include <QApplication>

BaseWidget::BaseWidget(QWidget *parent)
	: QWidget(parent,Qt::FramelessWindowHint),m_moving(false)
{

}

BaseWidget::~BaseWidget()
{

}

void BaseWidget::mousePressEvent( QMouseEvent *event )
{
	if((event->button() == Qt::LeftButton))
	{
		m_moving = true;
		m_offset = event->pos();
	}
}

void BaseWidget::mouseMoveEvent( QMouseEvent *event )
{
	if(m_moving)
	{
		//方法1:
		QDesktopWidget* desktop = QApplication::desktop();
		QRect windowRect(desktop->availableGeometry());
		QRect widgetRect(this->geometry());
		QPoint point(event->globalPos() - m_offset);

		//以下是防止窗口拖出可见范围外
		//左边
		if (point.x() <= 0)
		{
			point = QPoint(0,point.y());
		}
		//右边
		int y = windowRect.bottomRight().y() - this->size().height();
		if (point.y() >= y && widgetRect.topLeft().y() >= y)
		{
			point = QPoint(point.x(),y);
		}
		//上边
		if (point.y() <= 0)
		{
			point = QPoint(point.x(),0);
		}
		//下边
		int x = windowRect.bottomRight().x() - this->size().width();
		if (point.x() >= x && widgetRect.topLeft().x() >= x)
		{
			point = QPoint(x,point.y());
		}
		move(point);
		//方法2:
		//可以通过判断QRect windowRect是否包含(contains) QRect widgetRect 再移动
		//这里没有给出代码
	}
	//如果只是要求移动窗口,用以下代码即可实现
	//move(event->globalPos() - m_offset);
}

void BaseWidget::mouseReleaseEvent( QMouseEvent*event )
{
	if(event->button() == Qt::LeftButton)
		m_moving = false;
}
时间: 2024-07-30 03:28:26

qt 窗口无标题在桌面移动,不可移出可视范围之外的相关文章

MFC修改窗口无标题和标题信息,修改执执行文件图标

一.创建MFC后 窗口显示的是 无标题-工程名 修改方法在网上看到了几种,下面介绍下比较简单的一种: 1.在MianFrame.c文件中找到这个函数 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 2.在函数中添加这样一句可以 修改标题名称 m_strTitle = "我的标题v1.0"; 3.在函数中添加如下代码可以去除无标题几个字 cs.style &= ~FWS_ADDTOTITLE ;//防止MFC在窗口标题

QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透

qt 窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透 窗口置顶qt 里是 setWindowFlags(Qt::WindowStaysOnTopHint)kde 里是 KWindowSystem::setState(winId(), NET::KeepAbove)这样的置顶窗口不会处于全屏窗口的上方,如果需要真正的置顶,setWindowFlags(Qt::X11BypassWindowManagerHint) 可无视这个规则,但这样不会出现任务栏等,kimt

拖动无标题窗口的方法

有的时候,我们需要自绘窗口的标题,或者隐藏了窗口标题,那么问题来了,这就是怎么拖动无标题的窗口? 这个问题的本质便是怎么在窗口的客户区上,拖动鼠标,并且移动窗口. 通常状态下,一个窗口只有在标题栏的区域,才会响应鼠标拖动的消息.而在窗口的客户区并不会响应. 这样便有了一个方法,就是我们可以欺骗windows,让它误认为鼠标点击窗口客户区时是点击在了标题栏上. 有这么个消息,就是WM_NCHITTEST. MSDN对它的解释是: The WM_NCHITTEST message is sent t

深度探索QT窗口系统(五篇)

窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打开windows时,桌面就是一个窗口,你打开浏览器时,你也正在访问窗口...好了,回到今天的话题,QT窗口系统,QT是一个跨平台的框架,类似微软的MFC,Borland的OWL,前者只适用于windows,而使用QT你可以开发windows平台应用程序,你也可以开发linux应用程序,当然了你也可以

QT自绘标题和边框

在QT中如果想要自绘标题和边框,一般步骤是: 1) 在创建窗口前设置Qt::FramelessWindowHint标志,设置该标志后会创建一个无标题.无边框的窗口. 2)在客户区域的顶部创建一个自绘标题栏. 3)给窗口绘制一个背景作为边框. 4)如果想要鼠标拖动效果,可以在WM_NCHITTEST消息中返回HTCAPTION,具体方法百度这里不再详述. 但是这样做会导致一个问题: 在win7系统上,将窗口移动到屏幕边缘会自动排列(在屏幕顶部,左边,右边都会自动排列)的功能失效. 如果你的窗口没有

CentOS下Qt窗口透明效果失效,成黑色背景的问题

一.问题 Linux系统下Qt窗口的透明效果成了黑色,但同样的代码在windows机子上有透明效果,主要是修改系统的配置,仅在centos6.3及其以上版本实验过.其他系统可以相应配置. 二.问题运行图 (1)Qt透明效果,centos下运行都会出现如下图1所示. 三.解决方法 (1)窗口透明,窗口上的控件不透明,其代码设置 [html] view plain copy setAutoFillBackground(false);  //这个不设置的话就背景变黑 setWindowFlags(Qt

Qt5.3中qml ApplicationWindow设置窗口无边框问题

这个版本的qt在这里有点bug.. 设置ApplicationWindow的flags属性为Qt.FramelessWindowHint的确可以使程序无边框,但是同时程序在任务栏的图标也没了. 看文档发现 ApplicationWindow 是由 QQuickWindow 实现的,QQuickWindow 又继承于 QWindw. 直接创建一个QWindow对象实验了一下,代码如下 QWindow window; window.setFlags( Qt::FramelessWindowHint

Android TV 全屏无标题

想要全部窗口全屏无标题,修改 res\values\styles.xml 可设置主题和样式 <resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme"

MFC中的主窗口修改标题

MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行") 2.在框架类的PreCreateWindow函数里修改风格 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~FWS_ADDTOTITLE; //去除标题条中的文档名 return CFrameWnd