1.实现表头滚动鼠标缩放甘特图
重写HeaderWidget的wheelEvent事件处理
void HeaderWidget ::wheelEvent( QWheelEvent* e )
{
DateTimeGrid* const grid = qobject_cast< DateTimeGrid* >(view()->grid());
if (grid) {
qreal delta = static_cast<qreal>(e->delta());
delta = delta / 120.0;// / 10.0;
qreal dayWidth = grid->dayWidth() + delta;
//日最小宽度设置为1
if (dayWidth < 1.0)
{
dayWidth = 1.0;
}
qDebug() << "wheelEvent:" << dayWidth << "\n";
grid->setDayWidth(dayWidth);
}
}
2.切换表头 年月<–>月年日
在类GraphicsView里面添加信号函数
void gridChanged();
在GraphicsView::Private槽函数slotGridChanged里面发信号gridChanged
void GraphicsView::Private::slotGridChanged()
{
updateHeaderGeometry();
headerwidget.update();
q->updateSceneRect();
q->update();
//发信号
emit q->gridChanged();
}
class YmDateTimeScaleFormatter : public KDGantt::DateTimeScaleFormatter
{
public:
YmDateTimeScaleFormatter() : DateTimeScaleFormatter(Month, "MM"){}
/*reimp*/QString text(const QDateTime& dt) const
{
//表头日期格式 返回年月
return QObject::tr("%1年%2月").arg(dt.date().year()).arg(dt.date().month());
}
};
class MyWidget : public QWidget {
public:
MyWidget() : QWidget( 0 )
{
...
grid.setStartDateTime( QDateTime::currentDateTime().addDays( -3 ) );
grid.setDayWidth(30.0);//初始化日宽30px
setUpperGridYm();
grid.setScale(DateTimeGrid::ScaleUserDefined);
view.setGrid( &grid );
//连接上面发出的gridChanged事件
connect(view.graphicsView(), SIGNAL(gridChanged()),
this, SLOT(slotGridChanged()));
}
public slots:
void slotGridChanged()
{
qreal dayWidth = grid.dayWidth();
DateTimeScaleFormatter *pUpperScale = grid.userDefinedUpperScale();
if (dayWidth < dayVisibleWidth)
{
//年//月
if (DateTimeScaleFormatter::Range::Year != pUpperScale->range())
{
//更新
setUpperGridYear();
}
}
else
{
//年月//日
if (DateTimeScaleFormatter::Range::Month != pUpperScale->range())
{
//更新
setUpperGridYm();
}
}
}
private:
void setUpperGridYm();
void setUpperGridYear();
private:
KDGantt::View view;
KDGantt::DateTimeGrid grid;
qreal dayVisibleWidth = 10.0;//最小可视日宽度
};
//年月//日
void MyWidget::setUpperGridYm()
{
grid.setUserDefinedUpperScale(new YmDateTimeScaleFormatter());
grid.setUserDefinedLowerScale(new DateTimeScaleFormatter(DateTimeScaleFormatter::Day,
QString::fromLatin1("dd"),
QObject::tr("%1"),
Qt::AlignHCenter));
}
//年//月
void MyWidget::setUpperGridYear()
{
grid.setUserDefinedUpperScale(new DateTimeScaleFormatter(DateTimeScaleFormatter::Year,
QString::fromLatin1("yyyy"),
QString::fromLatin1("%1"),
Qt::AlignHCenter));
grid.setUserDefinedLowerScale(new DateTimeScaleFormatter(DateTimeScaleFormatter::Month,
QString::fromLatin1("M"),
QObject::tr("%1月"),
Qt::AlignHCenter));
}
int main( int argc, char** argv ) {
QApplication app( argc, argv );
MyWidget w;
w.show();
return app.exec();
}