Qt5 多顯示器獲取不同顯示器的分辨率和位置的方法


Qt5 多顯示器獲取不同顯示器的分辨率和位置的方法

注意(2020/1/17):此博客編寫時間較早,現 QDesktopWidget 已被廢棄不建議繼續使用,不建議繼續閱讀此博客作為參考

先放官方文檔鏈接:QDesktopWidget - Qt5 Reference

之前一直在用被我亂搞后的ShadowPlayer作為默認播放器,后來主力系統換成linux了也就沒再用了。這兩天the Witness發布,也正好想玩一些別的windows only的游戲,於是回到windows打算好好玩一玩游♂戲。而這幾天因為集訓也還是在機房,於是我拿着我那台電腦顯示器連着筆記本玩雙屏很爽,回到windows后發現依然很爽,不過播放器mini界面會有bug,總是會回到主顯示器的最右面,於是打算修一修,然后就有了這一片水文(

在只有一個顯示器的時候,獲得顯示器分辨率的方法是

    miRPos = QApplication::desktop()->screenGeometry().width(); //原來的寫法,奇怪的變量名先無視

然而實際發現無論如何這個得到的分辨率都是主顯示器的完整分辨率。然后查了Qt的Reference,才發現,這個的原型是

	const QRect QDesktopWidget::screenGeometry(int screen = -1) const

其中的參數就是顯示器的id,默認是-1,如果是多個顯示器,則顯示器編號依次為0(主顯示器),1,2,3...額,這個編號和你在設置里看到的編號沒一點關系 😃

如圖,這是我目前的顯示設置情況,其中標識為2的顯示器是主顯示器,1則是擴展顯示器。而實際上,我們通過

	QDesktopWidget * deskTop = QApplication::desktop();
    int curMonitor = deskTop->screenNumber ( this ); // 參數是一個QWidget*

獲得到的當前所在屏幕的編號來看,設置中標識為2的實際上是0,標識為1的實際是1.也就是說,系統設置中標識的編號和這里真的是一點關系都沒有啦。

當我們獲取到顯示器編號后,就可以通過這個來獲取當前所在屏幕的分辨率啦。

	QRect rect = desktop->screenGeometry(curMonitor);

這時rect.width和rect.height就是當前屏幕的分辨率了。而rect.x和rect.y是什么呢?回到剛剛的我的顯示器設置情況的圖,我們可以用上面的函數獲取主(編號為2的)顯示器rect.x和rect.y,你會發現rect.x=0,rect.y=0。可見,整個顯示器“坐標”是以主顯示器左上角為(0,0)點的。在擴展(此處編號為1的)顯示器獲得到的rect.x=-1366,rect.y=161說明這個就是那個擴展顯示器左上角的坐標了。那么我們就很容易通過這個來計算我們所需要的屏幕坐標了。

我的需求是讓這個仿osu的mini窗口的最右端和當前屏幕最右側對齊,上端和當前屏幕上端保持25px的邊距。那么就應該這樣做。

    miRPos = rect.x() + rect.width(); //當前屏幕最右側的位置,別吐槽這個變量名了(╯-_-)╯╧╧
    this->setGeometry(miRPos - this->width() , rect.y() + 25, this->width(), this->height());

然后我突然發現我是個奇葩的例外,因為我在小的顯示器上打游戲的時候通常任務欄會擋住游戲窗體,於是我把任務欄拖到右面了...那么上面所得到的結果,窗體則始終會和屏幕的最右面對齊並忽視任務欄的存在,如果翻過reference的話,你會發現這個問題非常好解決,只需要把 screenGeometry() 換成 availableGeometry() 就行了。這個獲取到的就是當前顯示器的可用部分了,在windows下就是不包括任務欄了。

或許你在沒創建widget的時候就想要獲取一個分辨率信息用於初始化或者別的作用了,你可以通過 curMonitor = desktop->primaryScreen(); 初始化顯示器編號為主顯示器的編號並由此獲取主顯示器的相關信息,或者通過其他提供的函數來達到你自己的目的。哦對了,好像curMonitor初始化為-1的時候獲取到的也始終是主顯示器的大小。畢竟默認值嘛。

最后的效果圖:

完成啦,吃飯飯去

參考資料:QDesktopWidget - Qt5 Reference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM