原文地址:http://blog.sina.com.cn/s/blog_4868f98601019odo.html 。感谢作者,如果造成任何不便,请联系我删除。
最近要用到多屏显示。
多屏显示的原理其实很好理解,就拿横向扩展来说:
计算机把桌面的 宽度扩展成了 w1(屏幕1的宽度) + w2(屏幕2的宽度) 。
当一个窗口的起始横坐标 > w1,则 他就被显示在第二个屏幕上了。
qt的说明文档中用一张图阐述了这个情况:
QApplication 提供了一个获得virtual desktop的方法:
QDesktopWidget *desktop =
QApplication::
desktop();
返回的QDesktopWidget 存储着当前桌面的信息。
注意 ,这个函数必须在创建了QApplication 对象之后才能使用, 否则会出错。具体原因,要问qt。
这个desktop有几个很有用的函数,用来获取当前的屏幕状态和分辨率
1) int desktop->primaryScreen()
获取主屏幕的索引序号,(windows开始菜单所在的屏幕为主屏幕), 每个副屏幕序号+1
2) intdesktop->screenCount()
获取当前屏幕个数
3)QRect desktop->screenGeometry(int screen_index)
根据当前的屏幕序号获取屏幕宽高等属性
4) int desktop->width()
获取虚拟屏幕全宽, 注意这个比较猛,是获取的总宽度,对于横向扩展屏来说,也就是 屏幕1+ 屏幕2 + ... 的宽度
5) int desktop->height()
获取虚拟屏幕全高
下面的这个程序就可以测试多屏(只测了横屏,没测试纵屏): 根据当前屏幕数量n,生成n个窗口,每个窗口都占据了一个屏幕
#include "mainwindow.h"
#include <QApplication>
#include <QDesktopWidget>
#include <cstdio>
#include <QMessageBox>
typedef struct{
int screen_no;
QRect rect;
}SCREEN;
SCREEN g_screens[10];
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDesktopWidget *desktop = QApplication::desktop();
int screen_count = desktop->screenCount();
int prim_screen = desktop->primaryScreen();
char warning[100], *idx=warning;
for(int i=0; i<screen_count ;i++ ){
g_screens[i].screen_no = prim_screen + i;
g_screens[i].rect = desktop->screenGeometry(prim_screen + i);
sprintf(idx, "screen%d w[%d], h[%d] ",i, g_screens[i].rect.width(),g_screens[i].rect.height());
idx += strlen(idx);
}
sprintf(idx, "total width[%d] , total height[%d] \n", desktop->width(), desktop->height() );
QMessageBox::warning(NULL, "screen", warning, QMessageBox::Ok);
MainWindow wnd[5];
for(int i=0; i < screen_count; i++){
wnd[i].resize(g_screens[i].rect.width(),g_screens[i].rect.height());
if(i == 0)
wnd[i].move(0,0);
else
wnd[i].move(i* g_screens[i-1].rect.width(),0);
char str[50];
sprintf(str,"this is screen %d",i);
wnd[i].show();
}
return app.exec();
}