C++ QT通过单击菜单栏c+移动整个窗口/应用程序+;

C++ QT通过单击菜单栏c+移动整个窗口/应用程序+;,c++,qt,C++,Qt,我想去掉应用程序的标题和边框,但要做到这一点,我需要能够通过在菜单栏上拖动来移动窗口。我发现有两种方法可以做到这一点: void TopMenuBar::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragPosition = event->globalPos() - frameGeometry().topLeft(); event

我想去掉应用程序的标题和边框,但要做到这一点,我需要能够通过在菜单栏上拖动来移动窗口。我发现有两种方法可以做到这一点:

void TopMenuBar::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();
    }
}

void TopMenuBar::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        move(event->globalPos() - dragPosition);
        event->accept();
    }
}
但是,如果我把它放在主窗口中,无论你点击什么,它都会移动,如果我把它放在自定义的QMenuBar中,它只会在窗口中移动菜单栏。我还尝试在对象之间进行一些信号和插槽技巧(比如在菜单栏中保留MousePresseEvent,在主窗口中保留mouseMoveEvent),但趋势是窗口将“跳转”到鼠标指针所在的位置,而不是平滑地移动它

还有谁能解决这个问题吗


环境是Windows

这肯定会起作用-刚刚检查过。调用ui->menuBar->installEventFilter(此选项)

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui->menuBar)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouse_event = dynamic_cast<QMouseEvent*>(event);
            if (mouse_event->button() == Qt::LeftButton)
            {
                dragPosition = mouse_event->globalPos() - frameGeometry().topLeft();
                return false;
            }
        }
        else if (event->type() == QEvent::MouseMove)
        {
            QMouseEvent* mouse_event = dynamic_cast<QMouseEvent*>(event);
            if (mouse_event->buttons() & Qt::LeftButton)
            {
                move(mouse_event->globalPos() - dragPosition);
                return false;
            }
        }


    }
    return false;
}
bool主窗口::事件过滤器(QObject*监视,QEvent*事件)
{
如果(监视==ui->菜单栏)
{
如果(事件->类型()==QEvent::MouseButtonPress)
{
QMouseEvent*鼠标事件=动态播放(事件);
如果(鼠标事件->按钮()==Qt::LeftButton)
{
dragPosition=mouse_event->globalPos()-frameGeometry().topLeft();
返回false;
}
}
else if(事件->类型()==QEvent::MouseMove)
{
QMouseEvent*鼠标事件=动态播放(事件);
if(鼠标事件->按钮()&Qt::LeftButton)
{
移动(鼠标事件->globalPos()-dragPosition);
返回false;
}
}
}
返回false;
}

这肯定有效-只需检查一下即可。调用ui->menuBar->installEventFilter(此选项)

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui->menuBar)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouse_event = dynamic_cast<QMouseEvent*>(event);
            if (mouse_event->button() == Qt::LeftButton)
            {
                dragPosition = mouse_event->globalPos() - frameGeometry().topLeft();
                return false;
            }
        }
        else if (event->type() == QEvent::MouseMove)
        {
            QMouseEvent* mouse_event = dynamic_cast<QMouseEvent*>(event);
            if (mouse_event->buttons() & Qt::LeftButton)
            {
                move(mouse_event->globalPos() - dragPosition);
                return false;
            }
        }


    }
    return false;
}
bool主窗口::事件过滤器(QObject*监视,QEvent*事件)
{
如果(监视==ui->菜单栏)
{
如果(事件->类型()==QEvent::MouseButtonPress)
{
QMouseEvent*鼠标事件=动态播放(事件);
如果(鼠标事件->按钮()==Qt::LeftButton)
{
dragPosition=mouse_event->globalPos()-frameGeometry().topLeft();
返回false;
}
}
else if(事件->类型()==QEvent::MouseMove)
{
QMouseEvent*鼠标事件=动态播放(事件);
if(鼠标事件->按钮()&Qt::LeftButton)
{
移动(鼠标事件->globalPos()-dragPosition);
返回false;
}
}
}
返回false;
}

移动整个窗口小部件时可能需要使用的重复项。window()->move()使整个窗口“跳转”到鼠标位置,这不是所需的功能。你应该能够平滑地拖动它。这不是真的。试着运行我链接的问题中的示例代码,窗口不会“跳转”到鼠标位置。它的移动与使用本机标题栏时一样平滑。这可能是你代码中的另一个问题,你是对的。我道歉。与我使用的代码相比,您链接到的代码中鼠标位置与窗口位置的计算方式有所不同。它可能会像那样工作。然而,Leontyev下面的回答也非常有效:)移动整个窗口的小部件时需要使用的可能重复项。window()->move()使整个窗口“跳转”到鼠标位置,这不是所需的功能。你应该能够平滑地拖动它。这不是真的。试着运行我链接的问题中的示例代码,窗口不会“跳转”到鼠标位置。它的移动与使用本机标题栏时一样平滑。这可能是你代码中的另一个问题,你是对的。我道歉。与我使用的代码相比,您链接到的代码中鼠标位置与窗口位置的计算方式有所不同。它可能会像那样工作。然而,Leontyev下面的回答也非常有效:)false总是返回,让菜单栏中的小部件在事件过滤器不中断的情况下被正确按下。这很有效!甚至不需要自定义菜单栏类。非常感谢!false总是返回,以便事件过滤器在不中断的情况下正确按下菜单栏中的小部件。这很有效!甚至不需要自定义菜单栏类。非常感谢!