c++ - Qt5 - 如何在无框窗口中指定一些可拖动区域?

标签 c++ qt

我在Qt5中制作了一个无框窗口。现在,我需要指定一些可拖动区域(QFrame)来移动窗口。如果我像时钟示例一样定义 mouseMoveEvent() 和 mousePressEvent() ,则窗口将变得完全可拖动...

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton)
    {
        move(event->globalPos() - dragPos);
        event->accept();
    }
}

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

我应该使用 mouseMoveEvent() 和 mousePressEvent() 创建 QFrame 子类吗?
如果是,怎么办?

最佳答案

您可以使用事件过滤器,在这种情况下,无需子类化即可完成此任务:

QPoint dragPos;//somewhere
//...
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    if (obj == ui->frame && event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *ev = static_cast<QMouseEvent *>(event);
        if (ev->buttons() & Qt::LeftButton)
        {

            dragPos = ev->globalPos() - ui->frame->geometry().topLeft();
        }
    }
    if (obj == ui->frame && event->type() == QEvent::MouseMove)
    {
        QMouseEvent *ev = static_cast<QMouseEvent *>(event);
        if (ev->buttons() & Qt::LeftButton)
        {
            ui->frame->move(ev->globalPos() - dragPos);
        }
    }
    return QObject::eventFilter(obj, event);
}

要使用eventFilter,您还应该:

protected:
    bool eventFilter(QObject *obj, QEvent *event);//in header

qApp->installEventFilter(this);//in constructor

使用此代码,我可以轻松拖动我的 ui->frame

关于c++ - Qt5 - 如何在无框窗口中指定一些可拖动区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26848569/

相关文章:

c++ - 跟进英语语法分析器

c++ - CMFCPopupMenu::RemoveItem 后弹出菜单中的空格

c++ - 在已经有 move ctor 的类中,copy ctor 中的 const 是否多余?

c++ - 为什么 lambda 返回 bool 值?

c++ - 如何通过Qt中的菜单锁定所有工具栏?

visual-studio - cmake + qt + Visual Studio : moc objects on build

c++ - 如何使用 wxWidgets C++ 加载 gif?

c++ - 重载函数模板消歧与 `std::enable_if` 和非推断上下文

c++ - QT Creator 无法识别新项目的 STL 类型

c++ - 公开 QTimer。 (Qt, C++)