首页 > 其他分享 >Qt widget 鼠标拖拽,分离新窗口

Qt widget 鼠标拖拽,分离新窗口

时间:2024-06-21 11:01:33浏览次数:25  
标签:widget Qt ObjWidget ui 新窗口 QWidget widget1 event

环境

Qt 5.4.2

功能

鼠标拖拽widget,分离出新的窗口,鼠标关闭窗口后,widget恢复之前的位置

源码

1.mainWindow.h

class MainWindow : public QMainWindow
{
private:
    QWidget *ObjWidget;

    QWidget *Widget1;
    QWidget *Widget2;
    QWidget *Widget3;
    QWidget *Widget4;
    QWidget *Widget5;
    QWidget *Widget6;

    QLayout *Layout1;
    QLayout *Layout2;
    QLayout *Layout3;
    QLayout *Layout4;
    QLayout *Layout5;
    QLayout *Layout6;

private slots:
    bool eventFilter(QObject *object, QEvent *event);
public:
    void MovePosWidget(QWidget *widget, QEvent *event);
    void RecoverWidget(QWidget *widget);
    void DeleteLayout(QWidget *widget);
    void DisplayWidget(QWidget *widget, QEvent *event);
};

2.mainWindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->widget1->installEventFilter(this);
    ui->widget2->installEventFilter(this);
    ui->widget3->installEventFilter(this);
    ui->widget4->installEventFilter(this);
    ui->widget5->installEventFilter(this);
    ui->widget6->installEventFilter(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}


static QPoint lastPoint;
static bool isHover = false;
static bool isHiden = false;

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    ObjWidget = NULL;
    ObjWidget = qobject_cast<QWidget*>(object);

    //筛选出Widget
    if(ObjWidget == NULL) { return QMainWindow::eventFilter(object,event); }


    switch(event->type())
    {
       //鼠标按下事件
       case QEvent::MouseButtonPress:{

          QMouseEvent* mouseEvent  = static_cast<QMouseEvent*>(event);

          if(ObjWidget->rect().contains(mouseEvent->pos()) && (mouseEvent->button() == Qt::LeftButton))
          {
               lastPoint = mouseEvent->pos();
               isHover = true;
          }

       }break;
       //鼠标移动
       case QEvent::MouseMove:{

            if(!isHover)  {  break;  }

            if(NULL == ObjWidget->parent())
            {
                MovePosWidget(ObjWidget,event);   //Widget窗口随鼠标移动
                return QMainWindow::eventFilter(ObjWidget,event);
            }


            DeleteLayout(ObjWidget);             //删除布局
            DisplayWidget(ObjWidget,event);      //显示窗口


       }break;
       //鼠标释放
       case QEvent::MouseButtonRelease:{

           if(!isHover)  {  break;  }

           if(NULL == ObjWidget->parent()) { return QMainWindow::eventFilter(ObjWidget,event); }

           isHover = false;

       }break;
       case QEvent::Close:{

           RecoverWidget(ObjWidget);            //恢复显示
           isHiden = true;

       }break;
       case QEvent::Hide:{

           if(isHiden)
           {
              isHiden = false;
           }else{

              return QMainWindow::eventFilter(ObjWidget,event);
           }
       }break;
       default:break;
    }

    return false;

}



void MainWindow::DisplayWidget(QWidget *widget,QEvent *event)
{
    QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);

    if("widget1" == widget->objectName())
    {
        Widget1 = widget;

        Widget1->setParent(NULL);
        Widget1->setWindowFlags(Qt::Dialog| Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);

        Widget1->setGeometry(mouseEvent->globalX(),mouseEvent->globalY(),300,300);
        Widget1->show();

        Widget1->move(mouseEvent->globalX(),mouseEvent->globalY());

        Widget1->setWindowTitle("Widget1");
        //......
    }

}

void MainWindow::DeleteLayout(QWidget *widget)
{

    if(("widget1" == widget->objectName()) && (NULL != ui->widget1_back->layout()))
    {
        Layout1 =  ui->widget1_back->layout();

        while(ui->widget1_back->layout()->count() > 0)
        {
            QLayoutItem *item = ui->widget1_back->layout()->takeAt(0);
            delete item;
        }
        ui->widget1_back->setMaximumWidth(0);
    }
    //......
}

void MainWindow::RecoverWidget(QWidget *widget)
{
    if("widget1" == widget->objectName())
    {
        Widget1->setParent(ui->widget1_back);
        Layout1->removeWidget(Widget1);
        Layout1->addWidget(Widget1);
        Layout1->setMargin(0);

        ui->widget1_back->setLayout(Layout1);
        ui->widget1_back->setMaximumWidth(16777215);

    }
    //......
}

void MainWindow::MovePosWidget(QWidget *widget, QEvent *event)
{
    QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);

    if("widget1" == widget->objectName())
    {
        widget->move(mouseEvent->globalX(),mouseEvent->globalY());
    }
    //......
}

运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:widget,Qt,ObjWidget,ui,新窗口,QWidget,widget1,event
From: https://blog.csdn.net/qq_32863863/article/details/139778748

相关文章

  • QT/QMessageBox/QTimerEvent/使用定时器制作一个闹钟
    1.使用定时器制作一个闹钟代码:widget.cpp:#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget),speecher(newQTextToSpeech(this))//给语音对象申请空间{ui->setupUi(this);......
  • 基于python-深度学习的混凝土马路和泥地马路识别-含数据集+pyqt界面
    代码下载:https://download.csdn.net/download/qq_34904125/89434765本代码是基于pythonpytorch环境安装的。下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。或可直接参考下面博文进行环境安装。深度学习环境安装教程-anaconda-python-pyto......
  • 基于python-CNN卷积神经网络的鱼类识别-含数据集+pyqt界面
    代码下载地址:https://download.csdn.net/download/qq_34904125/89434763本代码是基于pythonpytorch环境安装的。下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。或可直接参考下面博文进行环境安装。深度学习环境安装教程-anaconda-python-......
  • qt开发-03——信号与槽
    信号与槽(Signal&Slot)是Qt编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。信号(Signal)就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标单击时发射的clicked()信号,一个ComboBox......
  • qt开发-05_QPushButton
    按钮是最常用的控件;如果找不到文件可以这样:选择这个复制文件的路径,粘贴就可以了。在qt中新建一个项目,并且打开ui界面添加一个按钮;右键这个按钮可以有很多功能:先是这个转到槽,这个就是给按钮的动作添加效果的功能:这里有很多类的槽方法。都是源于他继承的父类。我们选择......
  • clion调试不显示qt变量值的问题
    用Clion做QT开发,调试时不能正常显示qt相关变量的值,只能显示地址,还要切换到qtcreator调试,很麻烦,就在网上找解决办法。搜了一圈,果然找到了,按照这篇文章中Clion调试QTQString看不到值问题处理_macosclion看不到qt变量内容-CSDN博客设置没用,又找到官方文档上一顿操作,还是不行。Q......
  • 基于QT和C++实现的中国象棋
    一,源码board.h#ifndefBOARD_H#defineBOARD_H#include<QWidget>#include"Stone.h"classBoard:publicQWidget{Q_OBJECTpublic:explicitBoard(QWidget*parent=0);bool_bRedTurn;//红方先走int_currentPlayer;//当前玩......
  • Visual Studio + Qt项目 数组超界不会报错。 堆栈 Cookie 检测代码检测到基于堆栈
    使用vs+Qt项目时,数组超界不会崩溃和报错的问题。 开启以下2个即可。  注意:1.启用了地址擦除系统会造成QT的异常崩溃,原因未知。2.有时会报cookie的错误,数组超界了,在退出函数时才会报错。   ......
  • PyQt5和Eric7的安装使用 —— Python篇
    需要安装Python的朋友请看另一篇文章:windows系统安装Python-----并安装使用Pycharm编辑器一、安装PyQt5:1、方法一:使用pip命令在线安装。输入以下命令可以直接安装:pipinstallPyQt5由于安装默认使用国外的镜像,可能因为网络问题会导致下载慢或者失败的现象。所以我们可以......
  • Qt | QPalette 类(调色版)
    01、简介1、需要用到 QWidget类中的如下属性palette:QPalette访问函数:constQPalette&palette()const;voidsetPalette(constQPalette&); 该属性描述了部件的调色板。在渲染标准部件时,窗口部件的样式会使用调色板,而且不同的平台或不同的样式通常具有不同的调色板。 ......