QT通过单击Menubar C 移动整个窗口/应用程序

QT Moving entire window/application by clicking on the menubar c++

本文关键字:窗口 应用程序 移动 单击 Menubar QT      更新时间:2023-10-16

我想摆脱我的应用程序的标题和边框,但是要做到这一点,我需要能够通过拖动Menubar来移动窗口。我发现这样做的两种方法是:

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();
    }
}

但是,如果我将其放在Mainwindow中,无论您单击什么,它都会四处移动,如果我将其放在自定义的Qmenubar中,则只会将菜单移动到窗口中。我还试图在对象之间进行一些信号和插槽欺骗(例如,在Mainubar中保持Mousepressevent和Mainemoveevent在Mainwindow中),但是趋势是窗口将"跳到"鼠标指针所在的位置,而不是顺利移动。

其他人有解决方案吗?

环境是Windows

这将适用于某些 - 只需检查一下即可。调用 ui-> Menubar-> InstalleventFilter(this); 在MainWindow构造器中。

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;
}