1

我在 qt 设计器中设计了一个表单
我还通过使用使我的程序无框架,Qt::FramelessWindowHint目前Qt::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);
}

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

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

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

4

1 回答 1

2

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

于 2021-05-15T08:56:02.233 回答