Qt——鼠标拖动调整窗口大小
要求:鼠标移到界面边角时,鼠标样式相应地发生改变。
实现方法一:
重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大小,或者是拖动界面。思路如上,实现起来很简单。但是存在一个问题,如果界面中放了一些其它控件,比如listWidget,此时鼠标在界面边缘移动速度稍微快一些,mouseMoveEvent就会被子控件截获了,鼠标样式不会改变,对于该方法的这个问题,我还没想到好的解决办法。
实现方法二:
在Qt中处理windows事件,具体实现如下,参考网上一些内容,我顺便修改优化了一下,源代码如下:
#ifndef MBASEWIDGET_H
#define MBASEWIDGET_H #include <QtWidgets/QWidget>
#include "windows.h" class MBaseWidget : public QWidget
{
Q_OBJECT public:
MBaseWidget(QWidget *parent);
~MBaseWidget();
void setMarginWidth(const int &); //设置鼠标可以在界面边缘多大范围内拖动改变界面大小
void serResizable(bool); //设置是否可以拖动改变大小 protected:
bool nativeEvent(const QByteArray & eventType, void * message, long * result);
bool winEvent(MSG *message, long *result); private:
int m_iMarginWidth;
bool m_bCanResize;
}; #endif // MBASEWIDGET_H
#include "MBaseWidget.h"
#include "windowsx.h" MBaseWidget::MBaseWidget(QWidget *parent)
: QWidget(parent)
{
m_iMarginWidth = 3;
m_bCanResize = true;
setWindowFlags(Qt::FramelessWindowHint);
} MBaseWidget::~MBaseWidget()
{ } void MBaseWidget::setMarginWidth(const int &iWidth)
{
m_iMarginWidth = iWidth;
} void MBaseWidget::serResizable(bool bCanResize)
{
m_bCanResize = bCanResize;
} //处理windows事件,在QT5中,被函数nativeEvent取代
bool MBaseWidget::winEvent(MSG *message, long *result)
{
switch (message->message)
{
case WM_NCHITTEST:
int iPosX = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();//鼠标位置x
int iPosY = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();//鼠标位置y *result = HTCAPTION; if (!m_bCanResize)
{
return true;//返回为真,此时仍可拖动,但无法改变大小
} if (iPosX >= 0 && iPosX <= m_iMarginWidth)
{
*result = HTLEFT;//左
int iHeight = this->height();
if (iPosY >= 0 && iPosY <= m_iMarginWidth)
{
*result = HTTOPLEFT;//左上
}
if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight)
{
*result = HTBOTTOMLEFT;//左下
}
return true;
} int iWidth = this->width();
int iHeight = this->height();
if (iPosX >= iWidth - m_iMarginWidth && iPosX <= iWidth)
{
*result = HTRIGHT;//右
if (iPosY >= 0 && iPosY <= m_iMarginWidth)
{
*result = HTTOPRIGHT;//右上
return true;
}
if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight)
{
*result = HTBOTTOMRIGHT;//右下
return true;
}
return true;
}
if (iPosY >= 0 && iPosY <= m_iMarginWidth)
{
*result = HTTOP;//上
return true;
}
if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight)
{
*result = HTBOTTOM;//下
return true;
}
return true;
}
return false;
} bool MBaseWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
return winEvent((MSG*)message, result);
}
这种方法是借助windows来实现的,所以受系统的限制,比如,拖动放大到与屏幕一样大时,就不能继续放大了,而且其它类直接继承这个类可能会出现问题。
实现方法三:
既然通过mouseMoveEvent不能解决鼠标的样式问题,那么可以考虑通过其它事件来实现,下面是我实现的一个类,包括头文件、dll和lib文件。
在VS中项目属性-链接器中进行相关配置即可。
Qt——鼠标拖动调整窗口大小的更多相关文章
- qt 鼠标拖动窗口放大缩小
// 鼠标拖动 具体实现void mouseMoveEvent(QMouseEvent * pEvent) { if (pEvent->buttons() & Qt::LeftButto ...
- Qt——鼠标拖动缩放窗口源码
#ifndef MOVEWIDGET_H #define MOVEWIDGET_H #include <QWidget> #include <QEvent> class Mov ...
- qt 鼠标拖动窗口 跳动 解决
因为获取当前的位置,似乎没有把标题栏的高度记进去. 所以移动前,得考虑到标题栏的高度. 用以下方式获取标题栏高度: QApplication::style()->pixelMetric(QSty ...
- OS X 使用技巧——轻松地调整窗口大小
如果你想调整窗口大小,只需要把鼠标指针悬停在窗口边框上.当它变成双向箭头时,点击并拖动鼠标即可完成这一操作. 但在实际操作中,迅速把鼠标指针定位到边框上比较困难. 解决的办法是:在终端输入以下命令: ...
- Mac如何让调整窗口大小更简单
在使用Mac的时候,你能把鼠标的光标悬停在任何程序的边缘,当光标自动变成箭头样式后,按住鼠标左键你将能随意拖动来改变程序窗口的大小.但是,这里有个问题,我们有时候很难控制把鼠标光标移动在正确的窗口边缘 ...
- jQuery拖动调整表格列宽度-resizableColumns
实现鼠标可拖动调整表格列宽度 如图: 一.引入文件: <script src="/js/jquery-1.8.0.min.js" type="text/javasc ...
- MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化
无边框窗体如何实现用鼠标拖动窗体边缘实现窗体大小变动呢?下面介绍一种方法,通过以下几个步骤即可实现: 1.实现WM_NCHITTEST消息,实现四条边框的模拟 2.实现WM_NCLBUTTONDOWN ...
- vue 拖动调整左右两侧div的宽度
原文链接:https://www.cnblogs.com/layaling/p/11009570.html 原文是左中右三种情况的拖动.由于项目需要,我删除掉了右边的,直接左右区域拖动调整div宽度 ...
- CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果
CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果 开始 一图抵千言.首先来看鼠标拖动太阳(光源)的情形. 然后是鼠标拖拽旋转模型的情形. 然后我们移动摄像 ...
随机推荐
- Reveal常用技巧(翻译来自Reveal官网blog)
翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥 ...
- 第八章 了解tempdb数据库
1.一个sqlserver数据库实例上只能有一个tempdb数据库,这个实例上所有的用户都共享这个数据库.2.tempdb数据库在每次sqlserver重启后都会重新创建,所以数据会丢失.3.因为te ...
- python数据结构-基本数据类型
- DevExpress GridControl使用方法总结(转)
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...
- python中列表和元组以及字符串的操作
python中列表是非常好用的.不过有一些使用小细节还需要注意一下. tag[32:-4] 从index为32到tag的倒数第4个字符. 如果索引为32的值在倒数第4个字符的右边,那么将输出为空.只要 ...
- hibernate一对一关系实现
按照主键映射,按照外键映射 Address.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping P ...
- Web Storage API : LocalStroage
这是一篇详细介绍详细介绍详细介绍_(:з」∠)_ 背景: 当你访问一个页面,并不是丢到服务器,等待用户访问就可以了的.从输入网址到显示网页的全过程,可以参考这里 简单来说,在输入url按下回车键后,首 ...
- Linked List Cycle
Given a linked list, determine if it has a cycle in it. /** * Definition for singly-linked list. * s ...
- Hive get table rows count batch
项目中需要比对两种方法计算生成的数据情况,需要做两件事情,比对生成的中间表的行数是否相同,比对最后一张表的数据是否一致. 在获取表的数据量是一条一条地使用select count(*) from ta ...
- 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的 ...