#include #include #include QScreen *screenForGeometry(const QRect &newGeometry, QScreen *currentScreen) { QScreen *fallback = currentScreen; const auto screens = currentScreen->virtualSiblings(); int largestIntersectionArea = 0; if (currentScreen) { for (QScreen *screen : screens) { QRect nativeScreenGeometry = QHighDpi::toNativePixels(screen->geometry(), screen); QRect nativeGeometry = QHighDpi::toNativePixels(newGeometry, screen); if (nativeScreenGeometry.contains(nativeGeometry.center())) { return screen; } QRect intersection = nativeScreenGeometry.intersected(nativeGeometry); int intesectionAria = intersection.width() * intersection.height() * screen->devicePixelRatio(); if (!intersection.isEmpty() && intesectionAria > largestIntersectionArea) { largestIntersectionArea = intesectionAria; fallback = screen; } } } return fallback; } QScreen *screenForPos(const QPoint &pos, QScreen *currentScreen) { return screenForGeometry(QRect(pos - QPoint(1, 1), QSize(3, 3)), currentScreen); } class Win : public QWidget { public: using QWidget::QWidget; void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::RightButton) { QScreen *s = screen(); if (s) { QPoint globalPos = mapToGlobal(event->pos()); moveStartOffset = QHighDpi::toNativePixels(pos(), s) - QHighDpi::toNativePixels(globalPos, screenForPos(globalPos, s)); moveStartSize = size(); } } } void mouseMoveEvent(QMouseEvent *event) override { if (event->buttons() & Qt::RightButton) { QScreen *s = screen(); if (s && windowHandle()) { QPoint globalPos = mapToGlobal(event->pos()); QScreen *cursorScreen = screenForPos(globalPos, s); QPoint newPos = QHighDpi::toNativePixels(globalPos, cursorScreen) + moveStartOffset; QSize size = QHighDpi::toNativePixels(moveStartSize, s); QRect nativeGeometry = QRect(newPos.x(), newPos.y(), size.width(), size.height()); QRect newGeometry = QHighDpi::fromNativePixels(nativeGeometry, s); QScreen *newScreen = screenForGeometry(newGeometry, s); if (newScreen && newScreen != s) { QSize newSize = QHighDpi::toNativePixels(moveStartSize, newScreen); nativeGeometry = QRect(newPos.x(), newPos.y(), newSize.width(), newSize.height()); s = newScreen; } newGeometry = QHighDpi::fromNativePixels(nativeGeometry, s); qDebug() << "Set" << newGeometry << "native:" << nativeGeometry; setGeometry(newGeometry); } } } QPoint moveStartOffset; QSize moveStartSize; }; int main(int argc, char **argv) { QApplication app(argc, argv); Win *window = new Win(); Qt::WindowFlags flags = window->windowFlags() | Qt::FramelessWindowHint; window->setWindowFlags(flags); window->show(); window->resize(874, 637); return app.exec(); }