如何调整大小和 areo snap frameless windows qt6
How to resize and areo snap frameless windows qt6
我在 qt designers 中设计了一个表单
我还使用 Qt::FramelessWindowHint
和 Qt::WA_TranslucentBackground
使我的程序无框架
目前我在我的程序中以这种方式手动编码拖动windows
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 来调整我的程序的大小(并且还能够从所有边缘调整它的大小),我找到了一些解决方案(比如 this and this)但是 none工作正常(可能是因为我使用的是设计器 ui 文件)
我想知道是否可以将 windows 与其他 window 对齐并在拖动到屏幕边缘时调整其大小,就像我们使用普通 window 框架一样?并从所有边缘自由调整大小?
感谢帮助
经过更多搜索,我终于找到了 this on github 这正是我想要的。
我在 qt designers 中设计了一个表单
我还使用 Qt::FramelessWindowHint
和 Qt::WA_TranslucentBackground
使我的程序无框架
目前我在我的程序中以这种方式手动编码拖动windows
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 来调整我的程序的大小(并且还能够从所有边缘调整它的大小),我找到了一些解决方案(比如 this and this)但是 none工作正常(可能是因为我使用的是设计器 ui 文件)
我想知道是否可以将 windows 与其他 window 对齐并在拖动到屏幕边缘时调整其大小,就像我们使用普通 window 框架一样?并从所有边缘自由调整大小?
感谢帮助
经过更多搜索,我终于找到了 this on github 这正是我想要的。