Qt 5, get the mouse position in a screen

前端 未结 6 1324
难免孤独
难免孤独 2020-12-17 10:37

First of all, I\'d like to mention that I found that related post How to get the mouse position on the screen in Qt? but it \"just didn\'t work\" for me. I made some tests,

相关标签:
6条回答
  • 2020-12-17 10:53

    Sice it seems that it can't be done with Qt (at least with my system configuration, and it seems that also in Windows) I decided to use the libX11 to make that implementation, which works like charm.

    It's not an ideal solution because I wanted to only use Qt, but it works.

    0 讨论(0)
  • 2020-12-17 10:57

    This may seem like a trivial solution, but on my KDE it works (I ran into the same problems originally). If you want to determine the local mouse coordinates with respect to a widget (this will be in device pixels and relative to the top left corner of the widget I believe) you can use

    QWidget::mapFromGlobal(QCursor::pos());
    

    i.e. call this->mapFromGlobal.

    0 讨论(0)
  • 2020-12-17 10:59

    This may work for you? It did for me

    QDesktopWidget *widget = QApplication::desktop(); QPosition globalCursorPosition = widget->cursor().pos();

    0 讨论(0)
  • 2020-12-17 11:03

    That's really weird. As a workaround, you could try this:

    QPoint globalCursorPos = QCursor::pos();
    int mouseScreen = qApp->desktop()->screenNumber(globalCursorPos);
    

    Now you know which screen the cursor is in. Then you could find the cursor position within that screen doing this:

    QRect mouseScreenGeometry = qApp->desktop()->screen(mouseScreen)->geometry();
    QPoint localCursorPos = globalCursorPos - mouseScreenGeometry.topLeft();
    
    0 讨论(0)
  • 2020-12-17 11:12

    To figure out on which screen you are, you can iterate throught QGuiApplication::screens() and check whether the cursor fits in the geometry of the screen.

    Here is a more complex example to compute the native cursor position (note the additional work needed to work with High DPI screens):

    QPoint getNativeCursorPosition()
    {
        QPoint pos = cursorPosToNative(QCursor::pos());
    
        // Cursor positions from Qt are calculated in a strange way, the offset to
        // the origin of the current screen is in device-independent pixels while
        // the origin itself is native!
    
        for (QScreen *screen : QGuiApplication::screens()) {
            QRect screenRect = screen->geometry();
            if (screenRect.contains(pos)) {
                QPoint origin = screenRect.topLeft();
                return origin + (pos - origin) * screen->devicePixelRatio();
            }
        }
    
        // should not happen, but try to find a good fallback.
        return pos * qApp->devicePixelRatio();
    }
    
    0 讨论(0)
  • 2020-12-17 11:13

    With QML you can use the properties of the Screen QML Type:

    Screen.virtualX : The x coordinate of the screen within the virtual desktop.

    Screen.virtualY : The y coordinate of the screen within the virtual desktop.

    import QtQuick 2.6
    import QtQuick.Window 2.2
    
    console.log("Pos x : " + Screen.virtualX )
    console.log("Pos y : " + Screen.virtualY )
    

    This work with single screen as well multi-monitor systems.

    0 讨论(0)
提交回复
热议问题