选中多个窗口中一个,绘制蓝色边框
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);
}
原文地址:https://blog.csdn.net/baochunlei1/article/details/142794259
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!