首页 > 其他分享 >选中多个窗口中一个,绘制蓝色边框

选中多个窗口中一个,绘制蓝色边框

时间:2024-10-09 19:11:29浏览次数:1  
标签:MultLayout sel void 边框 选中 QWidget include 绘制 ptr

1.需求描述

多个播放的窗口,选中其中的一个,用蓝色线框标记出来,如下图所示;

2.实现方式

通过mousePressEvent函数判断是点击了哪个窗口,然后用paintEvent函数来绘制窗口的边框;

#ifndef MULTLAYOUT_H
#define MULTLAYOUT_H

#include <QWidget>
#include "ui_MultLayout.h"
#include "LayoutElementMgr.h"
#include <QColor>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QMouseEvent>
#include <QPaintEvent>
class MultLayout : public QWidget
{
    Q_OBJECT

public:
    MultLayout(QWidget *parent = 0);
    ~MultLayout();
    void SetLayOutType(HUIControl::SplitTypeData::SplitType splitType);
protected:
    virtual void paintEvent(QPaintEvent *ptr_event) override;
    virtual void mousePressEvent(QMouseEvent *ptr_event) override;
    
private:
    QColor sel_widget_border_color_ = QColor(59, 144, 248);  // 选中窗口边框颜色
    Ui::MultLayout ui;
    QList<QWidget*> m_listWidget;
    int m_SelectWinId = -1;
};

#endif // MULTLAYOUT_H
#include "MultLayout.h"
#include "hlog1.h"
MultLayout::MultLayout(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
}

MultLayout::~MultLayout()
{

}

void MultLayout::SetLayOutType(HUIControl::SplitTypeData::SplitType splitType)
{
    CLayoutElemConf* pconfig = LayoutElementMgr::Instance().GetLayoutElementConfig(splitType);
    if (pconfig==NULL)
    {
        //获取失败
        LOG_ERROR("GetLayoutElementConfig failed %d", splitType);
        return;
    }
    QVector<LayoutElemItem>* listlayout= pconfig->GetElementItems();
    if (listlayout==NULL)
    {
        return;
    }
    //先清除
    QLayoutItem *child;
    while ((child = ui.gridLayout->takeAt(0)) != nullptr)
    {
        if (child->widget())
        {
            child->widget()->setParent(nullptr);//setParent(nullptr),防止删除之后界面不消失
        }
    }
    //补充widget数量
    int widgetcount = pconfig->GetLayoutWndCount();
    if (m_listWidget.size()<widgetcount)
    {
        for (int i= m_listWidget.size();i<widgetcount;i++)
        {
            QWidget* pwisget = new QWidget(this);
            pwisget->setStyleSheet(QLatin1String("QWidget\n"
                "{\n"
                "background:#000000;\n"
                "}"));
            m_listWidget.append(pwisget);
        }
    }
    //设置窗口布局
    QVector<LayoutElemItem>*  layoutitems = pconfig->GetElementItems();
    if (layoutitems->size()!= widgetcount)
    {
        LOG_ERROR("windows count %d is not equal to %d layout count ", widgetcount, layoutitems->size());
        return;
    }
    for (int i=0;i<layoutitems->size();i++)
    {
        LayoutElemItem item = layoutitems->at(i);
        ui.gridLayout->addWidget(m_listWidget[i], item.iRow, item.iColumn, item.iRowSpan, item.iColumnSpan);
    }
}

void MultLayout::paintEvent(QPaintEvent *ptr_event)
{
    if (m_SelectWinId>=0&&m_SelectWinId<m_listWidget.size())
    {
        QPainter painter(this);
        QPen pen;
        QBrush brush;
        painter.save();
        pen.setColor(sel_widget_border_color_);
        pen.setWidth(1);
        pen.setStyle(Qt::SolidLine);
        painter.setPen(pen);
        brush.setStyle(Qt::NoBrush);
        painter.setBrush(brush);
        QRect sel = m_listWidget[m_SelectWinId]->geometry();
        QRect sel_widget_border = QRect(sel.x() - 1, sel.y() - 1, sel.width() + 1, sel.height() + 1);
        painter.drawRect(sel_widget_border);
        painter.restore();
    }
    
}

void MultLayout::mousePressEvent(QMouseEvent *ptr_event)
{
    //QPoint press_point_ = ptr_event->pos();
    for (int i=0;i<m_listWidget.size();i++)
    {
        if (m_listWidget.at(i)->underMouse())
        {
            m_SelectWinId = i;
            break;
        }
    }
    repaint();
    return QWidget::mousePressEvent(ptr_event);
    
}

 

标签:MultLayout,sel,void,边框,选中,QWidget,include,绘制,ptr
From: https://www.cnblogs.com/bclshuai/p/18454949

相关文章

  • Python绘制--绘制心形曲线
    今天,我们将通过Python代码来绘制一个心形曲线,这是一个经典的数学表达。一、心形曲线的数学原理心形曲线,也被称为心脏曲线,是一个代数曲线,可以通过参数方程定义。其数学表达式如下:x=16sin⁡3(t)x=16sin3(t)y=13cos⁡(t)−5cos⁡(2t)−2cos⁡(3t)−cos⁡(4t)y=13cos(t)−5c......
  • 【Unity】绘制表格:排行榜
    绘制一款表格,表格特征为头行颜色不同、间隔行不同背景色、滚动视图;表格内容是分数排行榜,前三名有奖牌图标前缀。成果展示Scene部分标题和背景滚动视图:表头、表格行模板效果图脚本部分脚本绑定在滚动组件的Viewport物体上。publicclassHighscoreTable:MonoBehaviour......
  • 【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图
    在人类探索与塑造世界的征途中,有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制,更是对地球空间信息的精准捕捉与智慧应用。今天,让我们一起走进测绘的世界,解码“测绘”与“基础测绘”的内涵,并探讨实施《测绘法》的重要意义。什么是测绘?......
  • vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)
    目录一、申请密钥二、安装element-ui三、安装高德地图依赖四、完整代码五、运行截图六、官方文档七、Gitee源码一、申请密钥登录高德开放平台,点击我的应用,先添加新应用,然后再添加Key。​如图所示填写对应的信息,系统就会自动生成。​二、安装element-ui没安装的......
  • 基于JAVA绘制验证码
    目录概要整体架构流程代码解释Java绘图注意事项:Swing演示效果概要        Java绘图通常指的是在Java应用程序中创建和显示图形、图像和其他视觉元素。        Swing是Java的一个图形用户界面工具包,它提供了一套丰富的组件来构建桌面应用程序,包括......
  • unity编辑器绘制扇形
    使用UnityEditor.Handles.DrawSolidArc usingUnityEngine;usingUnityEditor;publicclassDrawSectorHandles:MonoBehaviour{publicfloatradius=5f;//扇形半径publicfloatangle=90f;//扇形角度publicColorarcColor=Color.red;/......
  • 异形热力图的绘制(以鞋垫上的柔性压力传感器阵列离散点绘制足部压力热力图为例)
    使用OpenCV和Python处理图像轮廓并离散化点集相信柔性传感器阵列领域的研究者们都看过如下的图(侵删):仿真这种云图只需要直接提取面就可以,但是实际我们制作的阵列只有离散点,甚至是不规则位置(非栅格、密度小)的几个器件,要怎么绘制成如上图所示呢?像我这种只会简单规则云图......
  • yunhantu绘制学习
    1. pymnet主页网址:https://mnets.github.io/pymnet/index.html Thelibraryisbasedonthegeneraldefinitionof multilayernetworks presentedina reviewarticle.Multilayernetworkscanbeusedtorepresentvarioustypesnetworkgeneralizationsfoun......
  • Python画笔案例-070 绘制通电棒棒
    1、绘制通电棒棒通过python的turtle库绘制通电棒棒,如下图:2、实现代码 绘制通电棒棒,以下为实现代码:"""通电棒棒.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pipinstallcoloradd程序运行需要很长时间,请耐心等待。可以......
  • webGL入门(五)绘制多边形
    代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......