linux下qt浮动窗口无法拖动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下qt浮动窗口无法拖动相关的知识,希望对你有一定的参考价值。

参考技术A 1.弹出来之后的dockwidget的titlebar右边需要有3个按钮分别来控制放大与恢复、弹出来与收进去和关闭按钮。考虑到Qt自带的dockwidget弹出来后实现不了这个,所以参考了网上的方法,需要自己从QWidget中派生一个类来实现自己的titlebar

2.因为dockwidget是嵌套在QTabWidget中的,而tabwidget本身是不可以拖动的,所以此dockwiget也不可以拖动(Qt中子窗口的拖动是和父窗口有关联的),加上需要实现自己的dockwidget样式,所以也从QDockWidget中派生一个类

QT软件开发:解决隐藏QWidget标题栏后窗体无法移动问题

一、前言

一般自定义标题栏时,就需要将原窗口的标题栏隐藏掉。默认情况下窗口无法被鼠标拖动的,需要自己处理鼠标事件,移动窗口达到拖动效果。

二、实现代码

只实现了窗口的拖动,随意拉伸没有实现。

如果要完美实现拉伸效果,可以看这里:

2.1 widget.h代码

#ifndef LOGIN_MAIN_H
#define LOGIN_MAIN_H

#include <QWidget>

namespace Ui {
class login_main;
}

class login_main : public QWidget
{
    Q_OBJECT

public:
     .........
private slots:
     .........
protected:
    //截取鼠标事件绘制窗口位置. 因为标题栏隐藏后.窗口是无法拖动的。
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
private:
    .........
    bool isPressedWidget;
    QPoint m_lastPos;
};

#endif // LOGIN_MAIN_H

2.2 widget.cpp代码

#include "login_main.h"
#include "ui_login_main.h"

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

     setWindowFlags(Qt::FramelessWindowHint);
}

void login_main::mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->globalPos();
    isPressedWidget = true; // 当前鼠标按下的即是QWidget而非界面上布局的其它控件
}


void login_main::mouseMoveEvent(QMouseEvent *event)
{
    if (isPressedWidget) {
        this->move(this->x() + (event->globalX() - m_lastPos.x()),
                   this->y() + (event->globalY() - m_lastPos.y()));
        m_lastPos = event->globalPos();
    }
}


void login_main::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug()<<"鼠标松开";
    m_lastPos = event->globalPos();
    isPressedWidget = false; // 鼠标松开时,置为false
}

以上是关于linux下qt浮动窗口无法拖动的主要内容,如果未能解决你的问题,请参考以下文章

QT+ 状态栏+核心控件+浮动窗口

如何创建C#版浮动工具栏

如何允许浮动 Qt5 停靠小部件的交互式调整大小

php 网站留言浮动窗口

mac上 类似 截图在浮动窗口好工具的软件有没有?

浮动窗口科尔多瓦