2015-08-16 105 views
8

首先,我想提一提的是,我發現相關的帖子How to get the mouse position on the screen in Qt?,但它對我來說「只是沒有用」。我做了一些測試,結果沒有像我預期的那樣工作,所以我決定做一個新的帖子來談論我做的測試並尋找替代解決方案。Qt 5,獲得鼠標在屏幕上的位置

是這樣的代碼,我用來做測試:

QScreen *screen0 = QApplication::screens().at(0); 
QScreen *screen1 = QApplication::screens().at(1); 

printf("screen0 %s \n", screen0->name().toStdString().c_str()); 
printf("screen1 %s \n", screen1->name().toStdString().c_str()); 

// Position on first screen. 
QPoint pos0 = QCursor::pos(screen0); 

// Position on second screen. 
QPoint pos1 = QCursor::pos(screen1); 

printf("pos 0: %d, %d \n", pos0.x(), pos0.y()); 
printf("pos 1: %d, %d \n", pos1.x(), pos1.y()); 

// Get position without screen. 
QPoint pos = QCursor::pos(); 
printf("pos: %d, %d \n", pos.x(), pos.y()); 

我所期待的,是隻有一個屏幕會返回一個有效的位置,因爲光標是隻在一個屏幕,而不是兩個。但它不是的情況下,兩個位置(pos0pos1)具有完全相同的值,我們可以在輸出中看到:

screen0 DVI-D-0 
screen1 HDMI-0 
pos 0: 1904, 1178 
pos 1: 1904, 1178 
pos: 1904, 1178 

由於兩個位置具有相同的價值觀,我不知道哪個屏幕是光標。我不知道這是一個正常的行爲還是一個錯誤,因爲文檔沒有說明當屏幕參數不是鼠標所在的屏幕時會發生什麼情況。

我的想法是打開/啓動一個應用程序(由Qt守護進程執行,必須檢測選定的屏幕)到鼠標所在的屏幕。我知道libX11這是可能的,因爲我過去做過,但我需要使用Qt 5,並且我無法弄清楚如何使用Qt檢測選定的屏幕。

我還做了其他測試,使用QApplicationQDesktopWidget類沒有運氣。

+0

您使用的是虛擬桌面嗎?雙頭? – peppe

回答

3

這真的很奇怪。作爲一種變通方法,你可以試試這個:

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

現在你知道哪個屏幕光標,然後你會發現,屏幕中的光標位置這樣做:

QRect mouseScreenGeometry = qApp->desktop()->screen(mouseScreen)->geometry(); 
QPoint localCursorPos = globalCursorPos - mouseScreenGeometry.topLeft(); 
+0

我試過了,但它總是返回屏幕0。即使你從screen1(pos(QScreen *))取得了這個點,它也會返回0. – armitage

+0

你使用的是Windows嗎?它在Windows 10上工作。 –

+0

我使用Getoo,KDE和Awesome作爲窗口管理器。也許這是一個配置問題。拉斐爾,你能分享輸出和你執行的代碼嗎? – armitage

0

SICE似乎它不能用Qt來完成(至少在我的系統配置下,似乎也是在Windows中),我決定使用libX11來實現這個實現,它的作用就像魅力一樣。

這不是一個理想的解決方案,因爲我只想使用Qt,但它的工作原理。

2

要弄清楚你是哪個屏幕,你可以遍歷t QGuiApplication::screens()並檢查光標是否適合屏幕的geometry

這裏是一個更復雜的例子來計算本地光標位置(注意:需要額外的工作,高DPI屏幕工作):

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

在這段代碼中,我認爲cursorPos應該改名爲pos。 – Dave

+0

@Dave固定,謝謝! – Lekensteyn

+0

這個'cursorPosToNative'函數需要哪個頭文件 - 它似乎不存在於Qt 5.9.3中? – Vertigo

0

這似乎是一個簡單的解決方案,但是在我的KDE它作品(我最初碰到相同的問題)。 如果你想確定本地鼠標相對於一個部件座標(這將是設備像素相對於widget的左上角我相信),你可以使用

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

即致電this->mapFromGlobal

相關問題