无锡外贸网站建设,一个人做企业网站要多少天,企业网站设计期末考试,开封做网站多屏显示的原理其实很好理解#xff0c;就拿横向扩展来说#xff1a; 计算机把桌面的 宽度扩展成了 w1#xff08;屏幕1的宽度#xff09; w2(屏幕2的宽度) 。 当一个窗口的起始横坐标 w1#xff0c;则 他就被显示在第二个屏幕上了。
drm设备可以多用户同时打开就拿横向扩展来说 计算机把桌面的 宽度扩展成了 w1屏幕1的宽度 w2(屏幕2的宽度) 。 当一个窗口的起始横坐标 w1则 他就被显示在第二个屏幕上了。
drm设备可以多用户同时打开FB获取的用户态虚拟内存地址映射到内核态物理内存地址也是不同的
多屏虚拟成一个桌面QScreen Class。qtbase/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp
QT可用的平台插件有xcb、eglfs、linuxfb、minimal、minimalegl、offscreen、vnc、wayland-egl、wayland、wayland-xcomposite-egl、wayland-xcomposite-glx、webgl等 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-screenGeometryint screen_index 根据当前的屏幕序号获取屏幕宽高等属性
4 int desktop-width() 获取虚拟屏幕全宽 注意这个比较猛是获取的总宽度对于横向扩展屏来说也就是 屏幕1 屏幕2 … 的宽度 5) int desktop-height() 获取虚拟屏幕全高
下面的这个程序就可以测试多屏只测了横屏没测试纵屏 根据当前屏幕数量n生成n个窗口每个窗口都占据了一个屏幕
#include mainwindow.h
#include QApplication
#include QDesktopWidget
#include cstdio
#include QMessageBoxtypedef 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], *idxwarning;
for(int i0; iscreen_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 i0; 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();
}
想实现这样一种功能主程序的主窗口在PC上显示而其子dialog在另外的显示器上显示做实验时方便监控且不会有多余的干扰。
方法如下 建立Qdesktopwidget对象 QDesktopWidget* desktop Applicationdesktop
获取当前显示器的个数
N desktop-screenCount();
如果有两个显示则N2qt默认的计算机主机的index 0外接显示器的index 1 QDialog 有个成员函数叫setGeometry只需要将dialog对象的Geometry设置为index为1的显示器即可默认为0.如果要显示的dialog的对象为mdlg则 mdlg.setGeometry(desktop-screenGeometry(1)); mdlg.show();
#include QDesktopWidget//获取屏幕信息
QDesktopWidget* desktop QApplication::desktop(); //获取屏幕对象这个函数必须在创建了 QApplication 对象之后才能使用 否则会出错
int screenNum desktop-screenCount(); //获取屏幕个数
int mainScreenID desktop-primaryScreen(); //获取主屏幕索引windows开始菜单所在的屏幕为主屏幕每个副屏幕序号1
QRect screenRect desktop-screenGeometry(int screen_index); //根据屏幕索引获取屏幕宽高等属性
int screenWidth desktop-width(); //获取屏幕的宽
int screenWidth desktop-height(); //获取屏幕的高
for(int i0; iscreenNum; i) { //获取每块屏幕分辨率 qDebug()屏幕i1分辨率: desktop-screenGeometry(i).size();
} //
//设置对话框mdlg显示在副屏1的左上角坐标
QDialog mdlg;
mdlg.setGeometry(desktop-screenGeometry(1));
mdlg.show();
//
//如果想全屏显示在副屏1则可以获取副屏1的分辨率更新对话框的大小再设置坐标
mdlg.resize(desktop-screenGeometry(1).size()); //设置对话框全屏
mdlg.setGeometry(desktop-screenGeometry(1)); //设置对话框对齐副屏1左上角坐标
mdlg.show();
// linuxfb实现多屏QT5已废弃
如果多屏对应一个fb 那么应该可以知道不同屏对应fb显示内存的位置只要根据位置去画窗口即可 如果多屏对应不同的设备 fb可以运行下面的命令来指定不同的fb在qt显示内存上的位置 ./xxx -qws -display Mutli:LinuxFb:0 LinuxFb:/dev/fb1:1:offset0,1080 xxx表示qt可执行文件 Mutli:LinuxFb:0 LinuxFb:/dev/fb1:1:offset0,1080 表示有两个输出fb分别是 /dev/fb0, /dev/fb1其中/dev/fb0的起始位置在 qt 显示内存的00 /dev/fb1的起始位置在 qt 显示内存的01080 程序中假设显示分辨率为1920x1080 在00到19201080范围内画窗口就显示在fb0上在01080到 19202160范围画窗口就显示在fb1上
引申内核态分配内存虚拟出一个fb0操作fb0时内核态程序将fb0内存复制到fb1和fb2内存中前提是fb1和fb2的内核态地址即物理地址连续且物理地址最好是固定的。实际验证
利用Qt实现双屏显示
前提是设备中有两个屏幕。这样在linux中Qt实现双屏显示就很简单了。只需要把窗口利用move函数移动到另一个屏幕的像素点就可以了。例如一屏分辨率为1280 * 800 二屏分辨率为800 * 480。 1如果你定义了一个 1600 * 800的窗口比一屏多出来400个像素点就会自动在二屏中显示不用任何处理前提是你到设备双屏能够正常运行 2如果想在一屏的基础上点击一个按钮弹出一个窗口而这个窗口想要在二屏上显示就需要利用move函数把这个对话框的位置移动到二屏上显示:move(1280,0);
对于上面的情况1(2),在linux上亲测没有问题但是在ARM平台上出现问题在点击了按钮后窗口并没有在二屏上显示而是在一屏中显示而且置于最底层(原来的窗口挡住了这个窗口因此并不能显示出来)。
在ARM设备中正常双屏显示如下
#ifdef DOUBLE_SCREENdesktop QApplication::desktop();
int N desktop-screenCount();
qDebug()screen :N;
qDebug()screen1 rect:desktop-screenGeometry(0);
qDebug()screen2 rect:desktop-screenGeometry(1);DoubleScreen *m_DoubleScreen new DoubleScreen;
m_DoubleScreen-initLab(desktop-screenGeometry(1));
m_DoubleScreen-show();#endifvoid DoubleScreen::initLab(QRect rect)
{setGeometry(rect);this-resize(800,480);labnew QLabel(this is desktopQString::number(num1),this);lab-setGeometry(0,0,rect.width(),rect.height());lab-setAlignment(Qt::AlignCenter) }
上述代码中DoubleScreen为继承QMainWindow的类而initLab为他到成员函数将二屏的rect作为initLab的参数传递进来然后通过setGeometry函数就能将DoubleScreen的窗口显示在二屏上了。