cabana: allocate qt objects on the heap instead of stack (#30374)

allocate qobject in heap
old-commit-hash: 86efd70fa9
testing-closet
Dean Lee 1 year ago committed by GitHub
parent 2dd2b0b179
commit efa9cce3de
  1. 13
      tools/cabana/chart/chart.cc
  2. 2
      tools/cabana/chart/chart.h
  3. 16
      tools/cabana/chart/chartswidget.cc
  4. 4
      tools/cabana/chart/chartswidget.h
  5. 9
      tools/cabana/videowidget.cc
  6. 2
      tools/cabana/videowidget.h

@ -25,7 +25,7 @@ const int AXIS_X_TOP_MARGIN = 4;
static inline bool xLessThan(const QPointF &p, float x) { return p.x() < x; } static inline bool xLessThan(const QPointF &p, float x) { return p.x() < x; }
ChartView::ChartView(const std::pair<double, double> &x_range, ChartsWidget *parent) ChartView::ChartView(const std::pair<double, double> &x_range, ChartsWidget *parent)
: charts_widget(parent), tip_label(this), QChartView(parent) { : charts_widget(parent), QChartView(parent) {
series_type = (SeriesType)settings.chart_series_type; series_type = (SeriesType)settings.chart_series_type;
chart()->setBackgroundVisible(false); chart()->setBackgroundVisible(false);
axis_x = new QValueAxis(this); axis_x = new QValueAxis(this);
@ -38,6 +38,7 @@ ChartView::ChartView(const std::pair<double, double> &x_range, ChartsWidget *par
axis_x->setRange(x_range.first, x_range.second); axis_x->setRange(x_range.first, x_range.second);
tip_label = new TipLabel(this);
createToolButtons(); createToolButtons();
setRubberBand(QChartView::HorizontalRubberBand); setRubberBand(QChartView::HorizontalRubberBand);
setMouseTracking(true); setMouseTracking(true);
@ -416,7 +417,7 @@ qreal ChartView::niceNumber(qreal x, bool ceiling) {
} }
void ChartView::leaveEvent(QEvent *event) { void ChartView::leaveEvent(QEvent *event) {
if (tip_label.isVisible()) { if (tip_label->isVisible()) {
charts_widget->showValueTip(-1); charts_widget->showValueTip(-1);
} }
QChartView::leaveEvent(event); QChartView::leaveEvent(event);
@ -543,7 +544,7 @@ void ChartView::mouseMoveEvent(QMouseEvent *ev) {
if (!is_zooming && plot_area.contains(ev->pos())) { if (!is_zooming && plot_area.contains(ev->pos())) {
const double sec = chart()->mapToValue(ev->pos()).x(); const double sec = chart()->mapToValue(ev->pos()).x();
charts_widget->showValueTip(sec); charts_widget->showValueTip(sec);
} else if (tip_label.isVisible()) { } else if (tip_label->isVisible()) {
charts_widget->showValueTip(-1); charts_widget->showValueTip(-1);
} }
@ -563,7 +564,7 @@ void ChartView::showTip(double sec) {
QRect tip_area(0, chart()->plotArea().top(), rect().width(), chart()->plotArea().height()); QRect tip_area(0, chart()->plotArea().top(), rect().width(), chart()->plotArea().height());
QRect visible_rect = charts_widget->chartVisibleRect(this).intersected(tip_area); QRect visible_rect = charts_widget->chartVisibleRect(this).intersected(tip_area);
if (visible_rect.isEmpty()) { if (visible_rect.isEmpty()) {
tip_label.hide(); tip_label->hide();
return; return;
} }
@ -593,14 +594,14 @@ void ChartView::showTip(double sec) {
QPoint pt(x, chart()->plotArea().top()); QPoint pt(x, chart()->plotArea().top());
text_list.push_front(QString::number(chart()->mapToValue({x, 0}).x(), 'f', 3)); text_list.push_front(QString::number(chart()->mapToValue({x, 0}).x(), 'f', 3));
QString text = "<p style='white-space:pre'>" % text_list.join("<br />") % "</p>"; QString text = "<p style='white-space:pre'>" % text_list.join("<br />") % "</p>";
tip_label.showText(pt, text, this, visible_rect); tip_label->showText(pt, text, this, visible_rect);
viewport()->update(); viewport()->update();
} }
void ChartView::hideTip() { void ChartView::hideTip() {
clearTrackPoints(); clearTrackPoints();
tooltip_x = -1; tooltip_x = -1;
tip_label.hide(); tip_label->hide();
viewport()->update(); viewport()->update();
} }

@ -108,7 +108,7 @@ private:
QGraphicsPixmapItem *move_icon; QGraphicsPixmapItem *move_icon;
QGraphicsProxyWidget *close_btn_proxy; QGraphicsProxyWidget *close_btn_proxy;
QGraphicsProxyWidget *manage_btn_proxy; QGraphicsProxyWidget *manage_btn_proxy;
TipLabel tip_label; TipLabel *tip_label;
std::vector<SigItem> sigs; std::vector<SigItem> sigs;
double cur_sec = 0; double cur_sec = 0;
SeriesType series_type = SeriesType::Line; SeriesType series_type = SeriesType::Line;

@ -14,7 +14,9 @@
const int MAX_COLUMN_COUNT = 4; const int MAX_COLUMN_COUNT = 4;
const int CHART_SPACING = 4; const int CHART_SPACING = 4;
ChartsWidget::ChartsWidget(QWidget *parent) : align_timer(this), auto_scroll_timer(this), QFrame(parent) { ChartsWidget::ChartsWidget(QWidget *parent) : QFrame(parent) {
align_timer = new QTimer(this);
auto_scroll_timer = new QTimer(this);
setFrameStyle(QFrame::StyledPanel | QFrame::Plain); setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
QVBoxLayout *main_layout = new QVBoxLayout(this); QVBoxLayout *main_layout = new QVBoxLayout(this);
main_layout->setContentsMargins(0, 0, 0, 0); main_layout->setContentsMargins(0, 0, 0, 0);
@ -95,9 +97,9 @@ ChartsWidget::ChartsWidget(QWidget *parent) : align_timer(this), auto_scroll_tim
range_slider->setValue(max_chart_range); range_slider->setValue(max_chart_range);
updateToolBar(); updateToolBar();
align_timer.setSingleShot(true); align_timer->setSingleShot(true);
QObject::connect(&align_timer, &QTimer::timeout, this, &ChartsWidget::alignCharts); QObject::connect(align_timer, &QTimer::timeout, this, &ChartsWidget::alignCharts);
QObject::connect(&auto_scroll_timer, &QTimer::timeout, this, &ChartsWidget::doAutoScroll); QObject::connect(auto_scroll_timer, &QTimer::timeout, this, &ChartsWidget::doAutoScroll);
QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &ChartsWidget::removeAll); QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &ChartsWidget::removeAll);
QObject::connect(can, &AbstractStream::eventsMerged, this, &ChartsWidget::eventsMerged); QObject::connect(can, &AbstractStream::eventsMerged, this, &ChartsWidget::eventsMerged);
QObject::connect(can, &AbstractStream::msgsReceived, this, &ChartsWidget::updateState); QObject::connect(can, &AbstractStream::msgsReceived, this, &ChartsWidget::updateState);
@ -253,7 +255,7 @@ ChartView *ChartsWidget::createChart() {
chart->setFixedHeight(settings.chart_height); chart->setFixedHeight(settings.chart_height);
chart->setMinimumWidth(CHART_MIN_WIDTH); chart->setMinimumWidth(CHART_MIN_WIDTH);
chart->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); chart->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
QObject::connect(chart, &ChartView::axisYLabelWidthChanged, &align_timer, qOverload<>(&QTimer::start)); QObject::connect(chart, &ChartView::axisYLabelWidthChanged, align_timer, qOverload<>(&QTimer::start));
charts.push_front(chart); charts.push_front(chart);
currentCharts().push_front(chart); currentCharts().push_front(chart);
updateLayout(true); updateLayout(true);
@ -334,11 +336,11 @@ void ChartsWidget::updateLayout(bool force) {
} }
void ChartsWidget::startAutoScroll() { void ChartsWidget::startAutoScroll() {
auto_scroll_timer.start(50); auto_scroll_timer->start(50);
} }
void ChartsWidget::stopAutoScroll() { void ChartsWidget::stopAutoScroll() {
auto_scroll_timer.stop(); auto_scroll_timer->stop();
auto_scroll_count = 0; auto_scroll_count = 0;
} }

@ -109,8 +109,8 @@ private:
int column_count = 1; int column_count = 1;
int current_column_count = 0; int current_column_count = 0;
int auto_scroll_count = 0; int auto_scroll_count = 0;
QTimer auto_scroll_timer; QTimer *auto_scroll_timer;
QTimer align_timer; QTimer *align_timer;
int current_theme = 0; int current_theme = 0;
friend class ZoomCommand; friend class ZoomCommand;
friend class ChartView; friend class ChartView;

@ -232,7 +232,8 @@ void VideoWidget::updatePlayBtnState() {
// Slider // Slider
Slider::Slider(QWidget *parent) : thumbnail_label(parent), QSlider(Qt::Horizontal, parent) { Slider::Slider(QWidget *parent) : QSlider(Qt::Horizontal, parent) {
thumbnail_label = new InfoLabel(parent);
setMouseTracking(true); setMouseTracking(true);
} }
@ -321,9 +322,9 @@ void Slider::mouseMoveEvent(QMouseEvent *e) {
if (!thumb.isNull()) { if (!thumb.isNull()) {
int x = std::clamp(pos - thumb.width() / 2, THUMBNAIL_MARGIN, width() - thumb.width() - THUMBNAIL_MARGIN + 1); int x = std::clamp(pos - thumb.width() / 2, THUMBNAIL_MARGIN, width() - thumb.width() - THUMBNAIL_MARGIN + 1);
int y = -thumb.height() - THUMBNAIL_MARGIN; int y = -thumb.height() - THUMBNAIL_MARGIN;
thumbnail_label.showPixmap(mapToParent(QPoint(x, y)), utils::formatSeconds(seconds), thumb, alertInfo(seconds)); thumbnail_label->showPixmap(mapToParent(QPoint(x, y)), utils::formatSeconds(seconds), thumb, alertInfo(seconds));
} else { } else {
thumbnail_label.hide(); thumbnail_label->hide();
} }
QSlider::mouseMoveEvent(e); QSlider::mouseMoveEvent(e);
} }
@ -335,7 +336,7 @@ bool Slider::event(QEvent *event) {
case QEvent::FocusIn: case QEvent::FocusIn:
case QEvent::FocusOut: case QEvent::FocusOut:
case QEvent::Leave: case QEvent::Leave:
thumbnail_label.hide(); thumbnail_label->hide();
break; break;
default: default:
break; break;

@ -56,7 +56,7 @@ private:
QMap<uint64_t, QPixmap> thumbnails; QMap<uint64_t, QPixmap> thumbnails;
std::map<uint64_t, AlertInfo> alerts; std::map<uint64_t, AlertInfo> alerts;
InfoLabel thumbnail_label; InfoLabel *thumbnail_label;
}; };
class VideoWidget : public QFrame { class VideoWidget : public QFrame {

Loading…
Cancel
Save