原文地址: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) int desktop->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();
}
转载请注明原文地址: https://ju.6miu.com/read-1310577.html