Qt多文档实现屏幕空间(类似监控多画面)效果

Qt多文档程序中的每一个子窗口就是一个个的画面,子窗口可以自由拖动,激活来使用。
现实中,类似于监控的多画面同时排列显示比较常见,也比较实用。
实现思路:
1、响应窗口的resizeEvent事件
2、根据分割数目,通过setGeometry动态设置子窗口相对位置
代码如下:

  1 #ifndef MAINWINDOW_H
  2 #define MAINWINDOW_H
  3
  4 #include <QMainWindow>
  5
  6 class QMdiArea;
  7 class QMdiSubWindow;
  8 class MainWindow : public QMainWindow
  9 {
 10     Q_OBJECT
 11
 12 public:
 13     MainWindow(QWidget *parent = nullptr);
 14     ~MainWindow();
 15
 16 protected:
 17     virtual void resizeEvent(QResizeEvent *event);
 18
 19 private:
 20     void splitWindow(QList<QMdiSubWindow *> list, QSize windowSize);
 21
 22 private:
 23     QMdiArea    *m_area;
 24 };
 25
 26 #endif // MAINWINDOW_H
 27
 28
 29 #include "MainWindow.h"
 30 #include <QMdiArea>
 31 #include <QMdiSubWindow>
 32 #include <QResizeEvent>
 33 #include "View.h"
 34 #include "Scene.h"
 35
 36 MainWindow::MainWindow(QWidget *parent)
 37     : QMainWindow(parent)
 38     , m_area(new QMdiArea())
 39 {
 40     /// set mdi area
 41     setCentralWidget(m_area);
 42
 43     /// test...
 44     for (int i = 0; i < 4; ++i) {
 45         View *view = new View(this);
 46         Scene *scene = new Scene();
 47         view->setScene(scene);
 48         QMdiSubWindow *subWindow = new QMdiSubWindow();
 49         subWindow->setWidget(view);
 50         subWindow->setWindowFlags(Qt::FramelessWindowHint);
 51         m_area->addSubWindow(subWindow);
 52     }
 53 }
 54
 55 MainWindow::~MainWindow()
 56 {
 57
 58 }
 59
 60 void MainWindow::resizeEvent(QResizeEvent *event)
 61 {
 62     if (nullptr != m_area){
 63         QList<QMdiSubWindow *> list = m_area->subWindowList();
 64         QSize windowSize = event->size();
 65         splitWindow(list, windowSize);
 66     }
 67
 68 }
 69
 70 void MainWindow::splitWindow(QList<QMdiSubWindow *> list, QSize windowSize)
 71 {
 72     int subWindow = list.size();
 73     switch (subWindow) {
 74     case 1:
 75         list.at(0)->setGeometry(0, 0, windowSize.width(), windowSize.height());
 76         break;
 77     case 2:
 78         for (int i = 0; i < subWindow; ++i) {
 79             if (i == 0){
 80                 list.at(i)->setGeometry(0, 0, windowSize.width() / 2, windowSize.height());
 81             }
 82             else {
 83                 list.at(i)->setGeometry(windowSize.width() / 2, 0, windowSize.width() / 2, windowSize.height());
 84             }
 85         }
 86         break;
 87     case 3:
 88     case 4:
 89         for (int i = 0; i < subWindow; ++i) {
 90             switch (i){
 91             case 0:
 92                 list.at(i)->setGeometry(0, 0, windowSize.width() / 2, windowSize.height() / 2);
 93                 break;
 94             case 1:
 95                 list.at(i)->setGeometry(windowSize.width() / 2, 0, windowSize.width() / 2, windowSize.height() / 2);
 96                 break;
 97             case 2:
 98                 list.at(i)->setGeometry(0, windowSize.height() / 2,  windowSize.width() / 2, windowSize.height() / 2);
 99                 break;
100             case 3:
101                 list.at(i)->setGeometry( windowSize.width() / 2, windowSize.height() / 2, windowSize.width() / 2, windowSize.height() / 2);
102                 break;
103             }
104         }
105
106     }
107 }
 1 #ifndef VIEW_H
 2 #define VIEW_H
 3
 4 #include <QGraphicsView>
 5
 6 class View : public QGraphicsView
 7 {
 8 public:
 9     View(QWidget *parent = nullptr);
10 };
11
12 #endif // VIEW_H
13
14 #include "View.h"
15
16
17 View::View(QWidget *parent)
18     : QGraphicsView(parent)
19 {
20
21 }
#ifndef SCENE_H
#define SCENE_H

#include <QGraphicsScene>

class Scene : public QGraphicsScene
{
public:
    Scene();
};

#endif // SCENE_H

#include "Scene.h"
#include <QGraphicsRectItem>

Scene::Scene()
{
    QGraphicsRectItem *item = new QGraphicsRectItem();
    item->setPos(100, 100);
    item->setRect(0, 0, 200, 100);
    item->setFlags(QGraphicsItem::ItemIsMovable);
    addItem(item);
}

构建运行:

原文地址:https://www.cnblogs.com/MakeView660/p/12503226.html

时间: 2024-11-09 16:01:01

Qt多文档实现屏幕空间(类似监控多画面)效果的相关文章

[ jquery 文档处理 append(content|fn) ] 此方法用于向每个匹配的元素内部追加内容,这个操作与javascript对指定的元素执行appendChild方法,将它们添加到文档中的情况类似

此方法用于向每个匹配的元素内部追加内容,这个操作与javascript对指定的元素执行appendChild方法,将它们添加到文档中的情况类似 参数解释如下: content 要追加到目标中的内容 function(index, html) 返回一个HTML字符串,用于追加到每一个匹配元素的里边.接受两个参数,index参数为对象在这个集合中的索引值,html参数为这个对象原先的html值. 实例: <html lang='zh-cn'> <head> <title>I

Qt多文档界面应用设计

使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类.可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细.另外,可以搜索例程"Mdi Example",这是提供的一个示例程序,这是一个多文档编辑器,代码很详细,只是缺少注释,不过很简单,应该容易看懂.接下来,我在这里介绍最简单.最精华的部分. 1 QMdiArea 这个类相当于一个MDI窗口管理器,用来管理添加到这个区域中的多个子窗口.我们在应用中新建的所有子窗

生成 Qt 文档

个人总结 从命令行进入Qt安装目录 设置环境变量 set path=D:/mingw32/bin;D:/Qt/5.0.0/qtbase/bin;D:/icu/bin;D:/icu/lib 运行 mingw32-make docs 进入到qtbase/doc 将qtdoc.qch注册到asstant assistant -register qtdoc.qch ======================================================================

跟随屏幕滚动层、遮罩层、获取Div相对定位、整个屏幕、html文档的jquery基本操作

一.层跟随屏幕滚动 <div style="width:120px;height:120px;border:1px solid red; position:absolute; left:800px; top:100px; z-index:1001;" id="AdminUserStateDiv">                </div>        <div class="div1">层1</div

Qt入门学习——Qt 5 帮助文档的使用

Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必要去记,用到什么就去帮助文档查看用法. 我们使用 Qt 帮助文档,主要分为这么几步: 1)类使用的相关介绍 2)查看所用部件(类)的相应成员函数(功能,参数,返回值) 3)查看部件的信号 4)查看部件的事件(所对应的虚函数如何编写) 1)类使用的相关介绍 光标移动到类名字的地方,接着按“F1”即可跳

XML文档类型定义---XML Schema结构

5.1 Schema概述 XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具. 使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它用不同于XML的语言编写,需要不同的分析器技术.这增加了工具开发商的负担,降低了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法.而XML Schema是按标准XML规则编写的,更容易掌握.二是DTD不支持名称空间.随着大部分的数据处理日益以XML为

Markdown 文档生成工具

之前用了很多Markdown 文档生成工具,发现有几个挺好用的,现在整理出来,方便大家快速学习. loppo: 非常简单的静态站点生成器 idoc:简单的文档生成工具 gitbook:大名鼎鼎的文档协作工具 docsify:一个神奇的文档站点生成器,简单轻巧,无需静态构建html 教程版: http://me.52fhy.com/learn-markdown-generate-tool/#/ loppo 官网: https://github.com/ruanyf/loppo 依赖 node.js

MongoDB实战-面向文档的数据(找到最合适的数据建模方式)

前一段时间一直研究通过Ruby操作MongoDB数据库,在学习的过程中也分享了自己学习成长的过程,撰写了包含两篇入门操作文章和十二篇进阶文章.本篇文章开始,我们将进入MongoDB的实战操作流程,MongoDB这一非关系型数据库-是一个文档型数据库,存储的是面向文档的数据. 如何在MongoDB数据库中使用schema 设计数据库schema是在已知数据库系统特性.数据本质以及应用程序需求的情况下为数据集选择最佳表述的过程.传统的关系型数据库RDBMS中鼓励使用正规化的数据模型,从而确保数据的可

CSS文档流

文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流. 每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 内联元素也不会独占一行. 几乎所有元素(包括块级,内联和列表元素)均可生成子行, 用于摆放子元素. 有三种情况将使得元素脱离文档流而存在,分别是浮动,绝对定位, 固定定位. 浮动元素不占任何正常文档流空间,而浮动元素的定位还是基于正常的文档流,然后从文档流中抽出并尽可能远的移动至左侧或者右侧.文字内容会围绕在浮