Qt——鼠标拖动调整窗口大小

要求:鼠标移到界面边角时,鼠标样式相应地发生改变。

实现方法一:

重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大小,或者是拖动界面。思路如上,实现起来很简单。但是存在一个问题,如果界面中放了一些其它控件,比如listWidget,此时鼠标在界面边缘移动速度稍微快一些,mouseMoveEvent就会被子控件截获了,鼠标样式不会改变,对于该方法的这个问题,我还没想到好的解决办法。

 

实现方法二:

在Qt中处理windows事件,具体实现如下,参考网上一些内容,我顺便修改优化了一下,源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#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中项目属性-链接器中进行相关配置即可。

点击下载

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要调整Qt MainWindow窗口的大小,可以使用resize()函数。该函数需要传递两个参数,即新窗口的宽度和高度。例如,以下代码将MainWindow窗口的大小设置为500x500像素: ```cpp MainWindow->resize(500, 500); ``` 另外,还可以使用setFixedSize()函数来设置窗口的固定大小。该函数只需要传递一个参数,即窗口的大小。例如,以下代码将MainWindow窗口的大小设置为400x400像素,并将其锁定为固定大小: ```cpp MainWindow->setFixedSize(400, 400); ``` ### 回答2: Qt是一个C++跨平台的应用程序开发框架,Qt提供的窗口管理QtMainWindow是窗口应用程序的一种标准组件。QtMainWindow可以帮助开发者构建基于窗口的应用程序,同时也提供了许多功能,例如菜单栏、工具栏及状态栏等等。在QtMainWindow中,窗口大小调整是常见的操作之一。 QtMainWindow提供了一些方法来处理不同状态下的窗口大小调整,需要根据实际需求选择适合的方法。 首先,我们可以通过设置窗口大小策略来控制窗口大小调整的行为。Qt提供了四个选项:固定大小、自适应大小、最小大小、最大大小。这些选项通过Qt::WindowSizeHints枚举类型定义,我们可以根据实际应用场景选择合适的大小策略,以达到我们期望的窗口大小调整效果。 其次,我们可以重载QMainWindow类中的resizeEvent(QResizeEvent * event)方法来处理与窗口大小调整相关的事件。resizeEvent在窗口大小调整时会被触发,我们可以在该方法中进行一些相关的逻辑处理,例如重新布局控件,改变控件大小等操作。 还有一个与窗口大小有关的概念是窗口模态。QtMainWindow可以定义不同的窗口模态,例如模态对话框、非模态对话框等,不同的模态定义会影响窗口的大小调整。当一个窗口存在于另一个窗口之上时,它被认为是模态的。在Qt中,我们可以通过QWidget::setModal方法来设置窗口的模态状态。 总之,QtMainWindow提供了许多方法来调整窗口大小,开发者需要根据实际应用场景选择合适的方法,以达到期望的用户体验。同时在使用过程中需要理解和掌握窗口模态、窗口大小策略等相关概念。 ### 回答3: 在Qt中,Qt MainWindow是一种非常常用的窗口控件,它提供了基础的窗口布局和管理,可以包含其他的控件和小部件。因此,经常需要调整Qt MainWindow的大小以满足用户需要。 首先,我们需要知道Qt MainWindow的一些基本概念。Qt MainWindow是由一个QMenuBar(菜单栏)、一个或多个QToolBar(工具栏)、一个QDockWidget(停靠控件)和一个QStatusBar(状态栏)组成的。除此之外,还可以包含其他的widget。这些widget是通过Qt MainWindow提供的QLayout(布局)来排列的。 QMainWindow提供了一个restoreGeometry函数,它可以用来保存窗口的几何形状(即窗口大小和位置信息)。因此,我们可以通过调用QMainWindow的restoreGeometry函数来实现窗口大小调整。 具体流程如下: 1. 通过`restoreGeometry`函数获取当前窗口状态下的大小信息,并将其保存到一个变量中,以备还原使用。 ``` QByteArray windowGeometry; QByteArray windowState; windowGeometry = saveGeometry(); windowState = saveState(); ``` 2. 调整窗口大小,可以通过修改MainWindow的大小来实现 ``` setGeometry(QRect(0, 0, 640,480)); ``` 3. 如果需要还原大小,可以通过调用`restoreGeometry`函数来实现 ``` restoreGeometry(windowGeometry); restoreState(windowState); ``` 通过上述流程,我们可以非常简单地实现Qt MainWindow的大小调整。值得注意的是,这种方式只是保存了窗口的大小信息,因此在窗口中包含其他控件的情况下,可能需要根据实际情况进行调整。如果还需要保持其他控件的位置和大小,可以使用更加复杂的布局管理调整窗口大小
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值