📄 qwt_legend.cpp
字号:
d_data->itemMode = mode;
}
QwtLegend::LegendItemMode QwtLegend::itemMode() const
{
return d_data->itemMode;
}
/*!
\return the IdentifierMode to be used in combination with
LegendDisplayPolicy::Fixed.
Default is ShowLine | ShowSymbol | ShowText.
*/
int QwtLegend::identifierMode() const
{
return d_data->identifierMode;
}
/*!
The contents widget is the only child of the viewport() and
the parent widget of all legend items.
*/
QWidget *QwtLegend::contentsWidget()
{
return d_data->view->contentsWidget;
}
QScrollBar *QwtLegend::horizontalScrollBar() const
{
return d_data->view->horizontalScrollBar();
}
QScrollBar *QwtLegend::verticalScrollBar() const
{
return d_data->view->horizontalScrollBar();
}
/*!
The contents widget is the only child of the viewport() and
the parent widget of all legend items.
*/
const QWidget *QwtLegend::contentsWidget() const
{
return d_data->view->contentsWidget;
}
/*!
Insert a new item for a plot item
\param plotItem Plot item
\param legendItem New legend item
\note The parent of item will be changed to QwtLegend::contentsWidget()
*/
void QwtLegend::insert(const QwtPlotItem *plotItem, QWidget *legendItem)
{
if ( legendItem == NULL || plotItem == NULL )
return;
QWidget *contentsWidget = d_data->view->contentsWidget;
if ( legendItem->parent() != contentsWidget )
{
#if QT_VERSION >= 0x040000
legendItem->setParent(contentsWidget);
#else
legendItem->reparent(contentsWidget, QPoint(0, 0));
#endif
}
legendItem->show();
d_data->map.insert(plotItem, legendItem);
layoutContents();
if ( contentsWidget->layout() )
{
#if QT_VERSION >= 0x040000
contentsWidget->layout()->addWidget(legendItem);
#endif
// set tab focus chain
QWidget *w = NULL;
#if QT_VERSION < 0x040000
QLayoutIterator layoutIterator =
contentsWidget->layout()->iterator();
for ( QLayoutItem *item = layoutIterator.current();
item != 0; item = ++layoutIterator)
{
#else
for (int i = 0; i < contentsWidget->layout()->count(); i++)
{
QLayoutItem *item = contentsWidget->layout()->itemAt(i);
#endif
if ( w && item->widget() )
{
QWidget::setTabOrder(w, item->widget());
w = item->widget();
}
}
}
if ( parentWidget() && parentWidget()->layout() == NULL )
{
/*
updateGeometry() doesn't post LayoutRequest in certain
situations, like when we are hidden. But we want the
parent widget notified, so it can show/hide the legend
depending on its items.
*/
#if QT_VERSION < 0x040000
QApplication::postEvent(parentWidget(),
new QEvent(QEvent::LayoutHint));
#else
QApplication::postEvent(parentWidget(),
new QEvent(QEvent::LayoutRequest));
#endif
}
}
/*!
Find the widget that represents a plot item
\param plotItem Plot item
\return Widget on the legend, or NULL
*/
QWidget *QwtLegend::find(const QwtPlotItem *plotItem) const
{
return d_data->map.find(plotItem);
}
/*!
Find the widget that represents a plot item
\param plotItem Plot item
\return Widget on the legend, or NULL
*/
QwtPlotItem *QwtLegend::find(const QWidget *legendItem) const
{
return d_data->map.find(legendItem);
}
/*!
Find the corresponding item for a plotItem and remove it
from the item list.
\param plotItem Plot item
*/
void QwtLegend::remove(const QwtPlotItem *plotItem)
{
QWidget *legendItem = d_data->map.find(plotItem);
d_data->map.remove(legendItem);
delete legendItem;
}
//! Remove all items.
void QwtLegend::clear()
{
#if QT_VERSION < 0x040000
bool doUpdate = isUpdatesEnabled();
#else
bool doUpdate = updatesEnabled();
#endif
setUpdatesEnabled(false);
d_data->map.clear();
setUpdatesEnabled(doUpdate);
update();
}
//! Return a size hint.
QSize QwtLegend::sizeHint() const
{
QSize hint = d_data->view->contentsWidget->sizeHint();
hint += QSize(2 * frameWidth(), 2 * frameWidth());
return hint;
}
/*!
\return The preferred height, for the width w.
\param width Width
*/
int QwtLegend::heightForWidth(int width) const
{
width -= 2 * frameWidth();
int h = d_data->view->contentsWidget->heightForWidth(width);
#if QT_VERSION < 0x040000
// Asking the layout is the default implementation in Qt4
if ( h <= 0 )
{
QLayout *l = d_data->view->contentsWidget->layout();
if ( l && l->hasHeightForWidth() )
h = l->heightForWidth(width);
}
#endif
if ( h >= 0 )
h += 2 * frameWidth();
return h;
}
/*!
Adjust contents widget and item layout to the size of the viewport().
*/
void QwtLegend::layoutContents()
{
const QSize visibleSize = d_data->view->viewport()->size();
const QLayout *l = d_data->view->contentsWidget->layout();
if ( l && l->inherits("QwtDynGridLayout") )
{
const QwtDynGridLayout *tl = (const QwtDynGridLayout *)l;
const int minW = int(tl->maxItemWidth()) + 2 * tl->margin();
int w = qwtMax(visibleSize.width(), minW);
int h = qwtMax(tl->heightForWidth(w), visibleSize.height());
const int vpWidth = d_data->view->viewportSize(w, h).width();
if ( w > vpWidth )
{
w = qwtMax(vpWidth, minW);
h = qwtMax(tl->heightForWidth(w), visibleSize.height());
}
d_data->view->contentsWidget->resize(w, h);
#if QT_VERSION < 0x040000
d_data->view->resizeContents(w, h);
#endif
}
}
/*
Filter layout related events of QwtLegend::contentsWidget().
\param o Object to be filtered
\param e Event
*/
bool QwtLegend::eventFilter(QObject *o, QEvent *e)
{
if ( o == d_data->view->contentsWidget )
{
switch(e->type())
{
case QEvent::ChildRemoved:
{
const QChildEvent *ce = (const QChildEvent *)e;
if ( ce->child()->isWidgetType() )
d_data->map.remove((QWidget *)ce->child());
break;
}
#if QT_VERSION < 0x040000
case QEvent::LayoutHint:
#else
case QEvent::LayoutRequest:
#endif
{
layoutContents();
break;
}
#if QT_VERSION < 0x040000
case QEvent::Resize:
{
updateGeometry();
break;
}
#endif
default:
break;
}
}
return QFrame::eventFilter(o, e);
}
//! Return true, if there are no legend items.
bool QwtLegend::isEmpty() const
{
return d_data->map.count() == 0;
}
//! Return the number of legend items.
uint QwtLegend::itemCount() const
{
return d_data->map.count();
}
#if QT_VERSION < 0x040000
QValueList<QWidget *> QwtLegend::legendItems() const
#else
QList<QWidget *> QwtLegend::legendItems() const
#endif
{
const QMap<QWidget *, const QwtPlotItem *> &map =
d_data->map.widgetMap();
#if QT_VERSION < 0x040000
QValueList<QWidget *> list;
#else
QList<QWidget *> list;
#endif
QMap<QWidget *, const QwtPlotItem *>::const_iterator it;
for ( it = map.begin(); it != map.end(); ++it )
list += it.key();
return list;
}
/*!
Resize event
\param e Event
*/
void QwtLegend::resizeEvent(QResizeEvent *e)
{
QFrame::resizeEvent(e);
d_data->view->setGeometry(contentsRect());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -