qt多顯示器獲取不同顯示器的分辨率和位置

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

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

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

    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的時候獲取到的也始終是主顯示器的大小。畢竟默認值嘛。

最後的效果圖:

發佈了117 篇原創文章 · 獲贊 160 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章