完成时间轴在任意时间间隔下的拖住移动操作
This commit is contained in:
parent
74bdcce7d2
commit
5ed47f24c8
|
|
@ -596,10 +596,11 @@ void DashboardFrame::onSignal_renameDashboard()
|
|||
|
||||
showTransparentMask();
|
||||
QPoint originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
|
||||
int nX = originPoint.x() + (ui->navigationPanel->width() - m_pDashboardNamingDialog->width()) * 0.5;
|
||||
int nY = originPoint.y() + ui->navigationPanel->height() * 0.5;
|
||||
int nX = (ui->navigationPanel->width() - m_pDashboardNamingDialog->width()) * 0.5;
|
||||
int nY = ui->navigationPanel->y() + ui->navigationPanel->height() * 0.5;
|
||||
m_pDashboardNamingDialog->setGeometry(nX, nY, m_pDashboardNamingDialog->width(), m_pDashboardNamingDialog->height());
|
||||
m_pDashboardNamingDialog->showUsedForRename();
|
||||
m_pDashboardNamingDialog->raise();
|
||||
}
|
||||
|
||||
void DashboardFrame::onSignal_panelSelectResult(const QString& strType)
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@ public:
|
|||
QColor m_lineColor;
|
||||
TimeUnit m_curTimeUnit;
|
||||
QDateTime m_curTime;
|
||||
QDateTime m_leftTime; //当前时间左边第一个需要输出展示的时间点
|
||||
QDateTime m_rightTime; //当前时间右边第一个需要输出展示的时间点
|
||||
int m_curTimePos; //当前时间所在的位置(x值),默认在中间(=0)
|
||||
int m_leftTimePos;
|
||||
int m_rightTimePos;
|
||||
DisplayState m_curState;
|
||||
int m_scaleSize; //时间刻度大小,单位为像素
|
||||
int m_scaleFactor; //缩放倍数
|
||||
|
|
@ -25,18 +25,17 @@ public:
|
|||
QPointF m_mouseDownPoint; //鼠标左键按下的坐标
|
||||
QDateTime m_mouseDownTime; //鼠标左键是按下坐标对应的时间
|
||||
};
|
||||
|
||||
TimeLineItemPrivate::TimeLineItemPrivate()
|
||||
{
|
||||
m_lineColor = Qt::white;
|
||||
m_curTimeUnit = TU_Year;
|
||||
m_curTime = QDateTime::currentDateTime();
|
||||
m_leftTime = m_curTime;
|
||||
m_curTimeUnit = TU_Minute_1;
|
||||
m_curTime = QDateTime::currentDateTime();/*QDateTime::fromString("2024-12-10 20:15:00", "yyyy-MM-dd hh:mm:ss");*/
|
||||
m_rightTime = m_curTime;
|
||||
m_curTimePos = 0;
|
||||
m_leftTimePos = 0;
|
||||
m_rightTimePos = 0;
|
||||
m_curState = RealTime;
|
||||
m_scaleSize = 100;
|
||||
m_scaleFactor = 1;
|
||||
m_scaleFactor = (int)m_curTimeUnit;
|
||||
}
|
||||
|
||||
TimeLineItem::TimeLineItem() :
|
||||
|
|
@ -113,33 +112,33 @@ void TimeLineItem::drawScaleLine(QPainter* p)
|
|||
p->setPen(pen);
|
||||
|
||||
QRect rect = boundingRect().toRect();
|
||||
d_ptr->m_leftTime = calculateLeftTime();
|
||||
d_ptr->m_leftTimePos = calculateLeftTimePos();
|
||||
d_ptr->m_rightTime = calculateRightTime();
|
||||
d_ptr->m_rightTimePos = calculateRightTimePos();
|
||||
|
||||
int x_Left = d_ptr->m_leftTimePos;
|
||||
int x_Right = x_Left + d_ptr->m_scaleSize;
|
||||
int x_Right = d_ptr->m_rightTimePos;
|
||||
int x_Left = x_Right - d_ptr->m_scaleSize;
|
||||
while(1)
|
||||
{
|
||||
if(x_Left < -rect.width() / 2 - 50)
|
||||
break;
|
||||
|
||||
p->drawLine(x_Left, d_ptr->m_titleRect.bottom(), x_Left, d_ptr->m_titleRect.bottom() - 5);
|
||||
drawTimeText(p, x_Left);
|
||||
x_Left -= d_ptr->m_scaleSize;
|
||||
}
|
||||
while(1)
|
||||
{
|
||||
if(x_Right > rect.width() / 2 + 50)
|
||||
if(x_Right > rect.width() / 2 + d_ptr->m_scaleSize * 2)
|
||||
break;
|
||||
|
||||
p->drawLine(x_Right, d_ptr->m_titleRect.bottom(), x_Right, d_ptr->m_titleRect.bottom() - 5);
|
||||
drawTimeText(p, x_Right);
|
||||
x_Right += d_ptr->m_scaleSize;
|
||||
}
|
||||
while(1)
|
||||
{
|
||||
if(x_Left < -rect.width() / 2 - d_ptr->m_scaleSize * 2)
|
||||
break;
|
||||
|
||||
p->drawLine(x_Left, d_ptr->m_titleRect.bottom(), x_Left, d_ptr->m_titleRect.bottom() - 5);
|
||||
drawTimeText(p, x_Left);
|
||||
x_Left -= d_ptr->m_scaleSize;
|
||||
}
|
||||
}
|
||||
void TimeLineItem::drawTimeText(QPainter* p, int x)
|
||||
{
|
||||
QDateTime time = calculateTime(x);
|
||||
QDateTime time = getTime(x);
|
||||
QString text = "";
|
||||
QString text1 = "";
|
||||
switch(d_ptr->m_curTimeUnit)
|
||||
|
|
@ -161,16 +160,16 @@ void TimeLineItem::drawTimeText(QPainter* p, int x)
|
|||
{
|
||||
int day = time.date().day();
|
||||
if (day == 1)
|
||||
text1 = time.toString("yyyy-MM");
|
||||
text = time.toString("dd");
|
||||
text1 = time.toString("yyyy/MM");
|
||||
text = time.toString("MM/dd");
|
||||
break;
|
||||
}
|
||||
case TU_Hour:
|
||||
{
|
||||
int hour = time.time().hour();
|
||||
if (hour == 0)
|
||||
text1 = time.toString("MM-dd");
|
||||
text = time.toString("hh");
|
||||
text1 = time.toString("MM/dd");
|
||||
text = time.toString("hh:mm");
|
||||
break;
|
||||
}
|
||||
case TU_Minute_30:
|
||||
|
|
@ -181,9 +180,9 @@ void TimeLineItem::drawTimeText(QPainter* p, int x)
|
|||
case TU_Minute_3:
|
||||
case TU_Minute_1:
|
||||
{
|
||||
int minute = time.time().minute();
|
||||
if (minute == 0)
|
||||
text1 = time.toString("MM-dd");
|
||||
int hour = time.time().hour();
|
||||
if (hour == 0)
|
||||
text1 = time.toString("MM/dd");
|
||||
text = time.toString("hh:mm");
|
||||
break;
|
||||
}
|
||||
|
|
@ -191,9 +190,9 @@ void TimeLineItem::drawTimeText(QPainter* p, int x)
|
|||
case TU_Second_10:
|
||||
case TU_Second_1:
|
||||
{
|
||||
int second = time.time().second();
|
||||
if(second == 0)
|
||||
text1 = time.toString("MM-dd");
|
||||
// int minute = time.time().minute();
|
||||
// if(minute == 0)
|
||||
// text1 = time.toString("MM-dd hh:mm");
|
||||
text = time.toString("hh:mm:ss");
|
||||
break;
|
||||
}
|
||||
|
|
@ -202,10 +201,10 @@ void TimeLineItem::drawTimeText(QPainter* p, int x)
|
|||
case TU_MSecond_50:
|
||||
case TU_MSecond_10:
|
||||
{
|
||||
int msec = time.time().msec();
|
||||
if(msec == 0)
|
||||
text1 = time.toString("MM-dd");
|
||||
text = time.toString("mm:ss:z");
|
||||
// int minute = time.time().minute();
|
||||
// if(minute == 0)
|
||||
// text1 = time.toString("MM-dd hh:mm");
|
||||
text = time.toString("hh:mm:ss.zzz");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
@ -230,80 +229,178 @@ void TimeLineItem::drawTimeText(QPainter* p, int x)
|
|||
}
|
||||
}
|
||||
|
||||
QDateTime TimeLineItem::calculateLeftTime()
|
||||
QDateTime TimeLineItem::calculateRightTime()
|
||||
{
|
||||
//必须保证时间点在整点时刻上,例如20mRange,时刻点为20:00、20:20、20:40、21:00,3mRange,时刻点为20:00,20:03、20:06...20:57、21:00。
|
||||
//所以时间区间一定可以被所在但愿整除,比如不能出现7m的时间单元
|
||||
QDateTime dateTime;
|
||||
QString strDateTime = d_ptr->m_curTime.toString("yyyyMMddhhmmssz");
|
||||
QString strDateTime = d_ptr->m_curTime.toString("yyyyMMddhhmmsszzz");;
|
||||
switch(d_ptr->m_curTimeUnit)
|
||||
{
|
||||
case TU_Year:
|
||||
strDateTime = strDateTime.left(4) + "01010000000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addYears(1).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(4) + "0101000000000";
|
||||
break;
|
||||
}
|
||||
case TU_Month:
|
||||
strDateTime = strDateTime.left(6) + "010000000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addMonths(1).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(6) + "01000000000";
|
||||
break;
|
||||
}
|
||||
case TU_Day:
|
||||
strDateTime = strDateTime.left(8) + "0000000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addDays(1).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(8) + "000000000";
|
||||
break;
|
||||
}
|
||||
case TU_Hour:
|
||||
strDateTime = strDateTime.left(10) + "00000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addSecs(60 * 60).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(10) + "0000000";
|
||||
break;
|
||||
}
|
||||
case TU_Minute_30:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addSecs(30 * 60).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(10) + "0000000";
|
||||
break;
|
||||
}
|
||||
case TU_Minute_20:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(10) + "0000000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(20 * 60);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TU_Minute_15:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(10) + "0000000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(15 * 60);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
case TU_Minute_10:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(10) + "0000000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(10 * 60);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TU_Minute_5:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(10) + "0000000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(5 * 60);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TU_Minute_3:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(10) + "0000000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(3 * 60);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TU_Minute_1:
|
||||
strDateTime = strDateTime.left(12) + "000";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addSecs(1 * 60).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(12) + "00000";
|
||||
break;
|
||||
}
|
||||
case TU_Second_30:
|
||||
strDateTime = strDateTime.left(14) + "0";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addSecs(30).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(12) + "00000";
|
||||
break;
|
||||
}
|
||||
case TU_Second_10:
|
||||
strDateTime = strDateTime.left(14) + "0";
|
||||
{
|
||||
QString strBeginTime = strDateTime.left(12) + "00000";
|
||||
dateTime = QDateTime::fromString(strBeginTime, "yyyyMMddhhmmsszzz");
|
||||
while(1)
|
||||
{
|
||||
dateTime = dateTime.addSecs(10);
|
||||
if(dateTime >= d_ptr->m_curTime)
|
||||
return dateTime;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TU_Second_1:
|
||||
strDateTime = strDateTime.left(14) + "0";
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addSecs(1).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(14) + "000";
|
||||
break;
|
||||
}
|
||||
case TU_MSecond_500:
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addMSecs(500).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(14) + "000";
|
||||
break;
|
||||
}
|
||||
case TU_MSecond_100:
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addMSecs(100).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(15) + "00";
|
||||
break;
|
||||
}
|
||||
case TU_MSecond_50:
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addMSecs(50).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(15) + "00";
|
||||
break;
|
||||
}
|
||||
case TU_MSecond_10:
|
||||
{
|
||||
strDateTime = d_ptr->m_curTime.addMSecs(10).toString("yyyyMMddhhmmsszzz");
|
||||
strDateTime = strDateTime.left(16) + "0";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dateTime = QDateTime::fromString(strDateTime, "yyyyMMddhhmmssz");
|
||||
dateTime = QDateTime::fromString(strDateTime, "yyyyMMddhhmmsszzz");
|
||||
return dateTime;
|
||||
}
|
||||
int TimeLineItem::calculateLeftTimePos()
|
||||
int TimeLineItem::calculateRightTimePos()
|
||||
{
|
||||
qint64 timeRange = d_ptr->m_leftTime.msecsTo(d_ptr->m_curTime);
|
||||
qint64 timeRange = d_ptr->m_rightTime.msecsTo(d_ptr->m_curTime); //右时刻晚于当前时刻,返回负值
|
||||
timeRange = -timeRange;
|
||||
qint64 scaleRange = 0;
|
||||
switch(d_ptr->m_curTimeUnit)
|
||||
{
|
||||
case TU_Year:
|
||||
scaleRange = 365 * 24 * 60 * 60 * (qint64)1000;
|
||||
scaleRange = d_ptr->m_curTime.date().daysInYear() * 24 * 60 * 60 * (qint64)1000;
|
||||
break;
|
||||
case TU_Month:
|
||||
scaleRange = 30 * 24 * 60 * 60 * (qint64)1000;
|
||||
scaleRange = d_ptr->m_curTime.date().daysInMonth() * 24 * 60 * 60 * (qint64)1000;
|
||||
break;
|
||||
case TU_Day:
|
||||
scaleRange = 24 * 60 * 60 * 1000;
|
||||
|
|
@ -357,74 +454,75 @@ int TimeLineItem::calculateLeftTimePos()
|
|||
break;
|
||||
}
|
||||
//qDebug() << timeRange << ", " << scaleRange;
|
||||
double dRatio = (double)timeRange / scaleRange;
|
||||
return d_ptr->m_curTimePos + (-d_ptr->m_scaleSize * dRatio);
|
||||
double dRatio = (double)timeRange / (double)scaleRange;
|
||||
//qDebug() << "leftTime:" << d_ptr->m_rightTime.toString("yyyy/MM/dd hh:mm:ss");
|
||||
return d_ptr->m_curTimePos + (d_ptr->m_scaleSize * dRatio);
|
||||
}
|
||||
|
||||
QDateTime TimeLineItem::calculateTime(int x)
|
||||
QDateTime TimeLineItem::calculateTime(double dUnit)
|
||||
{
|
||||
if(x == d_ptr->m_curTimePos)
|
||||
return d_ptr->m_curTime;
|
||||
|
||||
QDateTime dateTime;
|
||||
double dUnit = (double)(x - d_ptr->m_leftTimePos) / (double)d_ptr->m_scaleSize;
|
||||
switch(d_ptr->m_curTimeUnit)
|
||||
{
|
||||
case TU_Year:
|
||||
dateTime = d_ptr->m_leftTime.addYears((int)dUnit);//先计算年份
|
||||
dateTime = dateTime.addMSecs(dateTime.date().daysInYear() * 24 * 60 * 60 * 1000 * (dUnit - (int)dUnit)); //再计算时间
|
||||
{
|
||||
dateTime = d_ptr->m_rightTime.addYears((int)dUnit);//先计算年份
|
||||
dateTime = dateTime.addMSecs(dateTime.date().daysInYear() * 24 * 60 * 60 * (qint64)1000 * (dUnit - (int)dUnit)); //再计算时间
|
||||
break;
|
||||
}
|
||||
case TU_Month:
|
||||
dateTime = d_ptr->m_leftTime.addMonths((int)dUnit);//先计算月份
|
||||
dateTime = dateTime.addMSecs(dateTime.date().daysInMonth() * 24 * 60 * 60 * 1000 * (dUnit - (int)dUnit)); //再计算时间
|
||||
{
|
||||
dateTime = d_ptr->m_rightTime.addMonths((int)dUnit);//先计算月份
|
||||
dateTime = dateTime.addMSecs(dateTime.date().daysInMonth() * 24 * 60 * 60 * (qint64)1000 * (dUnit - (int)dUnit)); //再计算时间
|
||||
break;
|
||||
}
|
||||
case TU_Day:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(24 * 60 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(24 * 60 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Hour:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(60 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(60 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_30:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(30 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(30 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_20:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(20 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(20 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_15:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(15 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(15 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_10:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(10 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(10 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_5:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(5 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(5 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_3:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(3 * 60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(3 * 60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Minute_1:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(60 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(60 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Second_30:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(30 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(30 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Second_10:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(10 * 1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(10 * 1000 * dUnit);
|
||||
break;
|
||||
case TU_Second_1:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(1000 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(1000 * dUnit);
|
||||
break;
|
||||
case TU_MSecond_500:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(500 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(500 * dUnit);
|
||||
break;
|
||||
case TU_MSecond_100:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(100 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(100 * dUnit);
|
||||
break;
|
||||
case TU_MSecond_50:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(50 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(50 * dUnit);
|
||||
break;
|
||||
case TU_MSecond_10:
|
||||
dateTime = d_ptr->m_leftTime.addMSecs(10 * dUnit);
|
||||
dateTime = d_ptr->m_rightTime.addMSecs(10 * dUnit);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -433,6 +531,43 @@ QDateTime TimeLineItem::calculateTime(int x)
|
|||
return dateTime;
|
||||
}
|
||||
|
||||
QDateTime TimeLineItem::getTime(int x)
|
||||
{
|
||||
double dUnit = (double)(x - d_ptr->m_rightTimePos) / (double)d_ptr->m_scaleSize;
|
||||
return calculateTime(dUnit);
|
||||
}
|
||||
|
||||
qint64 TimeLineItem::getOffsetTimeValue(int x)
|
||||
{
|
||||
double dUnit = (double)(x) / (double)d_ptr->m_scaleSize;
|
||||
//在极小的时间刻度下做一定的倍数放大,从而让拖拽更平滑
|
||||
switch(d_ptr->m_curTimeUnit)
|
||||
{
|
||||
case TU_MSecond_100:
|
||||
dUnit = dUnit * 2;
|
||||
break;
|
||||
case TU_MSecond_50:
|
||||
dUnit = dUnit * 5;
|
||||
break;
|
||||
case TU_MSecond_10:
|
||||
{
|
||||
if(dUnit < 0)
|
||||
dUnit = -0.1;
|
||||
else if(dUnit > 0)
|
||||
dUnit = 0.1;
|
||||
//dUnit = dUnit * 10;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
QDateTime dateTime = calculateTime(dUnit);
|
||||
//qDebug() << dUnit << " " << dateTime.toString("hh:mm:ss.zzz");
|
||||
qint64 value = d_ptr->m_rightTime.msecsTo(dateTime);
|
||||
return value;
|
||||
}
|
||||
|
||||
void TimeLineItem::setLineColor(QColor color)
|
||||
{
|
||||
d_ptr->m_lineColor = color;
|
||||
|
|
@ -453,7 +588,13 @@ void TimeLineItem::setTime(QDateTime time)
|
|||
if(time > QDateTime::currentDateTime())
|
||||
return;
|
||||
|
||||
//qDebug() << "currTime:" << time.toString("hh:mm:ss.zzz");
|
||||
d_ptr->m_curTime = time;
|
||||
prepareGeometryChange();
|
||||
}
|
||||
QDateTime TimeLineItem::time()
|
||||
{
|
||||
return d_ptr->m_curTime;
|
||||
}
|
||||
|
||||
void TimeLineItem::zoomIn()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,19 @@
|
|||
#ifndef TIMELINEITEM_H
|
||||
#define TIMELINEITEM_H
|
||||
|
||||
/*******************************************************************************
|
||||
** TimeLine-TimeLineItem
|
||||
** author 段胜超
|
||||
**
|
||||
** TimeLine的核心组件,用于展现时间刻度线、时间点文字等信息,通过重绘来模拟
|
||||
** 鼠标的拖拽、缩放等操作。
|
||||
** 时刻分级必须保证可以被所属时刻区间整除,例如分钟内分级,必须可以被60整除,如3分、20分等,不能是7分、8分等
|
||||
** 如此才能保证时间刻度会压在“正点时刻”,例如20mRange,时刻点为20:00、20:20、20:40、21:00,3mRange,
|
||||
** 时刻点为20:00,20:03、20:06...20:57、21:00。
|
||||
** 这样可以保证拖动时跨越时间区间时,左右时刻可以无缝的转换,从而完成平滑的拖动效果
|
||||
**
|
||||
******************************************************************************/
|
||||
|
||||
#include "timeLine_globals.h"
|
||||
#include <QGraphicsObject>
|
||||
#include <QDateTime>
|
||||
|
|
@ -44,7 +57,11 @@ public:
|
|||
void setLineColor(QColor);
|
||||
void setScaleSize(int);
|
||||
void setState(DisplayState);
|
||||
|
||||
void setTime(QDateTime);
|
||||
QDateTime time();
|
||||
|
||||
qint64 getOffsetTimeValue(int); //获取时间的偏移值(相对当前时间,在鼠标移动拖拽时调用,通过拖拽时同步更改当前时间继而重绘时间轴从而模拟出拖拽效果)
|
||||
|
||||
void zoomIn();
|
||||
void zoomOut();
|
||||
|
|
@ -55,9 +72,10 @@ protected:
|
|||
private:
|
||||
void drawScaleLine(QPainter*);
|
||||
void drawTimeText(QPainter*, int);
|
||||
QDateTime calculateLeftTime(); //计算当前时间左侧第一个需要输出展示的时间点
|
||||
int calculateLeftTimePos(); //计算左侧时间点的坐标位置
|
||||
QDateTime calculateTime(int); //计算坐标点所对应的时间
|
||||
QDateTime calculateRightTime(); //计算当前时间右侧第一个需要输出展示的时间点
|
||||
int calculateRightTimePos(); //计算右侧时间点的坐标位置
|
||||
QDateTime calculateTime(double); //计算给定参数值所对应的时间,参数为scalesize的倍数
|
||||
QDateTime getTime(int); //获取坐标点(X)所对应的时间
|
||||
|
||||
private:
|
||||
TimeLineItemPrivate* d_ptr;
|
||||
|
|
|
|||
|
|
@ -9,11 +9,21 @@
|
|||
class TimeLineWidgetPrivate
|
||||
{
|
||||
public:
|
||||
TimeLineWidgetPrivate();
|
||||
|
||||
QGraphicsScene* m_pScene;
|
||||
QColor m_background_color;
|
||||
|
||||
bool m_bMousePress;
|
||||
QPoint m_ptMousePress;
|
||||
QDateTime m_timeMousePress;
|
||||
|
||||
TimeLine::TimeLineItem* m_timeLineItem;
|
||||
};
|
||||
TimeLineWidgetPrivate::TimeLineWidgetPrivate()
|
||||
{
|
||||
m_bMousePress = false;
|
||||
}
|
||||
|
||||
TimeLineWidget::TimeLineWidget(QWidget *parent)
|
||||
: QGraphicsView(parent)
|
||||
|
|
@ -41,15 +51,42 @@ void TimeLineWidget::resizeEvent(QResizeEvent* e)
|
|||
}
|
||||
void TimeLineWidget::mousePressEvent(QMouseEvent* e)
|
||||
{
|
||||
|
||||
if (Qt::LeftButton == e->button())
|
||||
{
|
||||
d_ptr->m_bMousePress = true;
|
||||
d_ptr->m_ptMousePress = e->pos();
|
||||
d_ptr->m_timeMousePress = d_ptr->m_timeLineItem->time();
|
||||
setCursor(Qt::ClosedHandCursor);
|
||||
}
|
||||
else
|
||||
QGraphicsView::mousePressEvent(e);
|
||||
}
|
||||
void TimeLineWidget::mouseMoveEvent(QMouseEvent* e)
|
||||
{
|
||||
if(d_ptr->m_bMousePress)
|
||||
{
|
||||
int offsetX = e->pos().x() - d_ptr->m_ptMousePress.x();
|
||||
qint64 offsetValue = d_ptr->m_timeLineItem->getOffsetTimeValue(offsetX);
|
||||
offsetValue = qAbs(offsetValue);
|
||||
if(offsetX < 0)
|
||||
offsetValue = -offsetValue;
|
||||
|
||||
d_ptr->m_timeLineItem->setTime(d_ptr->m_timeMousePress.addMSecs(-offsetValue));
|
||||
d_ptr->m_ptMousePress = e->pos();
|
||||
d_ptr->m_timeMousePress = d_ptr->m_timeLineItem->time();
|
||||
}
|
||||
else
|
||||
QGraphicsView::mouseMoveEvent(e);
|
||||
}
|
||||
void TimeLineWidget::mouseReleaseEvent(QMouseEvent* e)
|
||||
{
|
||||
|
||||
if (Qt::LeftButton == e->button())
|
||||
{
|
||||
d_ptr->m_bMousePress = false;
|
||||
setCursor(Qt::ArrowCursor);
|
||||
}
|
||||
else
|
||||
QGraphicsView::mousePressEvent(e);
|
||||
}
|
||||
void TimeLineWidget::wheelEvent(QWheelEvent* e)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue