21,495
社区成员
发帖
与我相关
我的任务
分享//main.cpp
#include <QtWidgets/QApplication>
#include "lineWidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
lineWidget* w = new lineWidget();
w->resize(800,450);
w->show();
return app.exec();
} //lineWidget.h
#ifndef lineWidget_h
#define lineWidget_h
#include <QWidget>
#include "GraphicsView.h"
class lineWidget: public QWidget
{
Q_OBJECT
Q_DISABLE_COPY(timeLine)
public:
explicit lineWidget(QWidget* parent = 0, Qt::WindowFlags f = 0);
virtual ~lineWidget(){}
//>获取单例
static lineWidget* GetInstance() { return m_pInstance; }
//>获取指针
GraphicsView* GetlineWidgetView() { return m_plineWidgetView; }
private:
static lineWidget* m_pInstance;
GraphicsView* m_plineWidgetView;
};
#endif // lineWidget_h//lineWidget.cpp
#include "lineWidget.h"
#include <QHBoxLayout>
lineWidget* lineWidget::m_pInstance = nullptr;
lineWidget::lineWidget(QWidget* parent, Qt::WindowFlags f)
: QWidget(parent,f)
{
Q_ASSERT(m_pInstance == nullptr);
m_pInstance = this;
m_plineWidgetView= new GraphicsView(this);
QHBoxLayout* hLay = new QHBoxLayout(this);
hLay->addWidget(m_plineWidgetView);
setLayout(hLay);
}//GraphicsView.h
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
#include "GraphicsScene.h"
class GraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit GraphicsView(QWidget *parent = 0);
void setscene(GraphicsScene* pCurScene);
GraphicsScene* getscene();
virtual ~GraphicsView(){}
protected:
virtual void mousePressEvent(QMouseEvent *event) override;
virtual void mouseMoveEvent(QMouseEvent *pEvent) override;
private:
//>加载场景
GraphicsScene *m_pCurScene;
};
#endif // GRAPHICSVIEW_H//GraphicsView.cpp
#include "GraphicsView.h"
GraphicsView::GraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
setWindowFlags(Qt::FramelessWindowHint);
setBackgroundBrush(QColor(62, 62, 66));
QRect r(-width()/2, -height()/2, width(), height());
m_pCurScene = new GraphicsScene(r,this);
setscene(m_pCurScene);
}
void GraphicsView::setscene(GraphicsScene* pCurScene)
{
m_pCurScene = pCurScene;
setScene(pCurScene);
}
GraphicsScene* GraphicsView::getscene()
{
return m_pCurScene;
}
void GraphicsView::mousePressEvent(QMouseEvent *event)
{
return QGraphicsView::mousePressEvent(event);
}
void GraphicsView::mouseMoveEvent(QMouseEvent *pEvent)
{
return QGraphicsView::mouseMoveEvent(pEvent);
}//GraphicsScene.h
#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H
#include <QGraphicsScene>
class timeWidget;
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
explicit GraphicsScene(const QRectF &sceneRect, QObject *parent = 0);
virtual ~GraphicsScene(){}
protected:
virtual void mousePressEvent(QGraphicsSceneMouseEvent *pEvent) override;
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *pEvent) override;
private:
timeWidget *m_timeWidget;
};
#endif // GRAPHICSVIEW_HGraphicsScene.cpp
#include "GraphicsScene.h"
#include "timeWidget.h"
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
GraphicsScene::GraphicsScene(const QRectF &sceneRect, QObject *parent)
: QGraphicsScene(sceneRect,parent)
{
m_timeWidget = new timeWidget();
addItem(m_timeWidget);
}
void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *pEvent)
{
return QGraphicsScene::mousePressEvent(pEvent);
}
void GraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *pEvent)
{
return QGraphicsScene::mouseMoveEvent(pEvent);
}
//timeWidget.h
#ifndef TIMEWIDGET_H
#define TIMEWIDGET_H
#include <QGraphicsWidget>
class Stripe;
class QGraphicsLinearLayout;
class timeWidget : public QGraphicsWidget
{
Q_OBJECT
public:
explicit timeWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
virtual ~timeWidget(){}
protected:
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
public slots:
void addStripe(Stripe* stripe = 0);
private:
void CreateLayout();
private:
QGraphicsLinearLayout *m_pLayout;
//> 窗口集合
QList<Stripe*> m_stripies;
};
#endif // TIMEWIDGET_H//timeWidget.cpp
#include "timeWidget.h"
#include "rulerwidget.h"
#include "CursorItem.h"
#include "Stripe.h"
#include <QGraphicsLinearLayout>
#include <QWidget>
//#include <QGraphicsScene>
timeWidget::timeWidget(QGraphicsItem *parent, Qt::WindowFlags wFlags)
: QGraphicsWidget(parent,wFlags)
{
CreateLayout();
for( int i = 0 ; i < 5 ; i++)
addStripe();
}
void timeWidget::CreateLayout()
{
m_pLayout = new QGraphicsLinearLayout(Qt::Vertical,this);
m_pLayout->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_pLayout->setContentsMargins(0, 0, 0, 0);
m_pLayout->setSpacing(0);
m_pLayout->setPreferredWidth(0);
setLayout(m_pLayout);
}
void timeWidget::addStripe(Stripe* parent)
{
Stripe *new_stripe;
if( parent )
new_stripe = new Stripe(parent);
else
new_stripe = new Stripe(this);
new_stripe->setZValue(-10);
new_stripe->setBackColor(QColor(37,37,38));
m_pLayout->addItem(new_stripe);
m_stripies << new_stripe;
}
void timeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QRect rc( widget->rect() );
int stripieHeight(0);
int i(0);
for ( auto stripie : m_stripies )
{
stripie->setOriginHeight( stripieHeight );
stripieHeight += stripie->getHeightPercentage() * rc.height()/2;
i++;
}
}//Stripe.h
#ifndef TRACK_H
#define TRACK_H
#include "rectWidgetBase.h"
class Stripe : public rectWidgetBase
{
Q_OBJECT
public:
explicit Stripe(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
explicit Stripe(Stripe *parent, Qt::WindowFlags wFlags = 0);
virtual ~Stripe(){}
protected:
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
private:
//>是否为子项
bool m_isChildren;
};
#endif // CURSORITEM_H//Stripe.cpp
#include "Stripe.h"
#include <QPainter>
Stripe::Stripe(QGraphicsItem *parent,Qt::WindowFlags wFlags)
: rectWidgetBase(parent,wFlags)
, m_isChildren(false)
{
}
Stripe::Stripe(Stripe *parent, Qt::WindowFlags wFlags)
: rectWidgetBase(parent,wFlags)
, m_isChildren(true)
{
}
void Stripe::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
rectWidgetBase::paint(painter,option,widget);
// 绘制顶部边框线
painter->setPen(QColor(0,0,0));
painter->drawLine( rect().topLeft(), rect().topRight() );
}
//rectWidgetBase.h
#ifndef RECTWIDGETBASE_H
#define RECTWIDGETBASE_H
#include <QGraphicsWidget>
class rectWidgetBase : public QGraphicsWidget
{
Q_OBJECT
public:
explicit rectWidgetBase(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
virtual ~rectWidgetBase(){}
//>设置起始高度
inline void setOriginHeight(int originheight){m_originheight = originheight;}
//>设置高度占窗口百分比
inline void setHeightPercentage(double heightPercentage){m_heightPercentage = heightPercentage;}
//>设置宽度占窗口百分比
inline void setWidthPercentage(double widthPercentage){m_widthPercentage = widthPercentage;}
//>设置背景色
inline void setBackColor(QColor color){m_backcolor = color;}
//>获取左上角X坐标
inline int getWidgetLeftTopX(){ return m_leftTopX; }
//>获取左上角Y坐标
inline int getWidgetLeftTopY(){ return m_leftTopY; }
//>获取宽度
inline int getWidgetWidth(){ return m_width; }
//>获取宽度百分比
inline double getWidthPercentage(){ return m_widthPercentage; }
//>获取高度
inline int getWidgetHeight(){ return m_height; }
//>获取条形框高度百分比
inline double getHeightPercentage(){ return m_heightPercentage; }
protected:
//>重绘
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
private:
//>高度占窗口百分比
double m_heightPercentage;
//>初始高度
int m_originheight;
//>高度
int m_height;
//>宽度占窗口百分比
double m_widthPercentage;
//>宽度
int m_width;
//>背景色
QColor m_backcolor;
//>左上角顶点X坐标
int m_leftTopX;
//>左上角顶点Y坐标
int m_leftTopY;
};
#endif // RECTWIDGETBASE_H
//rectWidgetBase.cpp
#include "rectWidgetBase.h"
#include <QWidget>
#include <QPainter>
#include <QGraphicsScene>
rectWidgetBase::rectWidgetBase(QGraphicsItem *parent,Qt::WindowFlags wFlags)
: QGraphicsWidget(parent,wFlags)
, m_leftTopX(0)
, m_leftTopY(0)
, m_width(0)
, m_height(0)
, m_originheight(0)
, m_widthPercentage(0.4)
, m_heightPercentage(0.2)
, m_backcolor(QColor(45,45,48))
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setContentsMargins(0, 0, 0, 0);
setFlags(QGraphicsItem::ItemSendsScenePositionChanges);
}
void rectWidgetBase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QRect rc( widget->rect() );
double left = rc.width() / 2 * m_widthPercentage;
m_leftTopX = -rc.width() / 2 + left;
m_leftTopY = -rc.height() / 2 + m_originheight;
m_width = rc.width() - left - 1;
m_height = rc.height() / 2 * m_heightPercentage;
//> 绘制条形框背景
painter->setBrush(m_backcolor);
painter->setPen(Qt::NoPen/*QColor(0, 255, 0)*/);
QRect r(m_leftTopX, m_leftTopY, m_width, m_height);
resize(m_width, m_height);
painter->drawRect( rect() );
setPos(m_leftTopX, m_leftTopY);
if ( scene() )
scene()->update();
}
void timeWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
if( !scene() )
return QGraphicsWidget::paint(painter,option,widget);
QRectF rc( scene()->sceneRect() );
int rulerHeight(0);
int stripieHeight(0);
int i(0);
for ( auto stripie : m_stripies )
{
int originHeight = rulerHeight + stripieHeight;
stripieHeight += stripie->getHeightPercentage() * rc.height()/2;
stripie->setOriginHeight( originHeight );
i++;
stripie->setPos( rc.width()/2 * (stripie->getWidthPercentage()-1), -rc.height()/2 + originHeight );
}
scene()->update(rc);
}另外,由于sceneRect()的大小应实时随窗口改变,故应在GraphicsView中添加paint函数来随时修改大小 void GraphicsView::paintEvent(QPaintEvent *event)
{
QRect r(-width()/2+2, -height()/2+2, width()-4, height()-4);//2为边距,+2使得与QGraphicsItem::paint中的widget大小保持一致
m_pCurScene->setSceneRect(r);
QRect re = rect();
QGraphicsView::paintEvent(event);
}由于时间原因,未能自动全部显示部件的原因尚未找到,如有人知道,烦请告诉我一声,不甚感激~