如何调整大小和区域捕捉无框窗口 qt6

时间:2021-05-14 14:36:30

标签: c++ qt winapi qt6

我在qt设计师中设计了一个表单
我还使用 Qt::FramelessWindowHintQt::WA_TranslucentBackground
使我的程序无框架 目前我以这种方式在我的程序中手动编码拖动窗口

bool Qt6Gui::eventFilter(QObject* obj, QEvent* event)
{
    switch (event->type())
    {
    case QEvent::MouseButtonDblClick:
    {
        auto* mouseEvent = static_cast<QMouseEvent*>(event);
        if (obj == ui.titleRightInfo && mouseEvent->buttons() & Qt::MouseButton::LeftButton)
            QTimer::singleShot(250, this, &Qt6Gui::maximize_restore);
    }
    break;
    case QEvent::MouseButtonPress:
    {
        if (obj == ui.titleRightInfo)
        {
            auto* mouseEvent = static_cast<QMouseEvent*>(event);

            if (mouseEvent->buttons() & Qt::MouseButton::LeftButton)
            {
                mouse_pos = ui.titleRightInfo->mapToGlobal(mouseEvent->pos());

                onMove = true;
            }
        }
    }
    break;
    case QEvent::MouseMove:
    {
        if (obj == ui.titleRightInfo && onMove)
        {
            auto* mouseEvent = static_cast<QMouseEvent*>(event);

            if (mouseEvent->buttons() & Qt::MouseButton::LeftButton)
            {
                auto glb_mousepos = ui.titleRightInfo->mapToGlobal(mouseEvent->pos());
                auto delta = glb_mousepos - mouse_pos;

                if (delta.x() || delta.y())
                {
                    auto newpos = this->pos() + delta;
                    mouse_pos = glb_mousepos;
                    if (GLOBAL_STATE == 1)
                        maximize_restore();
                    this->move(newpos);
                }
            }
        }
    }
    break;
    case QEvent::MouseButtonRelease:
    {
        if (obj == ui.titleRightInfo && onMove)
        {
            auto pos = this->mapToGlobal(QPoint(0, 0));
            if (pos.y() < 0)
            {
                auto old_pos = this->pos();
                this->move(old_pos.x(), old_pos.y() - pos.y() + 1);
            }

            onMove = false;
        }
    }
    break;
    }

    return QWidget::eventFilter(obj, event);
}

它的工作没有任何问题,但它缺少区域
并且我还使用 QSizeGrip 调整我的程序的大小

QSizeGrip* sizegrip = new QSizeGrip(ui.frame_size_grip);
sizegrip->setStyleSheet("width: 20px; height: 20px; margin 0px; padding: 0px;");

它也能工作,但只能用于我程序的一侧
我的问题是我希望能够使用 areo snap 来调整我的程序大小(并且还能够从所有边缘调整它的大小),我找到了一些解决方案(如 thisthis),但没有他们中的人像我一样工作(可能是因为我正在使用设计器 ui 文件) 我想知道是否可以将窗口与其他窗口对齐并在拖动到屏幕边缘时调整其大小,就像我们使用普通窗口框架一样?并且还可以自由地从所有边缘调整它的大小?
感谢帮助

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我终于找到了 this on github 这正是我想要的。