【问题标题】:qt c++ how to delete and add widgets againqt c++如何再次删除和添加小部件
【发布时间】:2019-09-08 17:50:00
【问题描述】:

我想替换基于组合框的小部件。我在组合框中有两种类型,以下是这些类型的函数:

void ThemeWidget::renderModeGraph() {
    clearMode();

    //create charts
    QChartView *chartView;

    chartView = new QChartView(createChart());
    m_ui->top_left_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->top_right_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->bottom_left_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->bottom_right_graph->addWidget(chartView);
    m_charts << chartView;
}

void ThemeWidget::renderModeGraphStar() {
    clearMode();

    //create charts
    QChartView *chartView;

    chartView = new QChartView(createChart());
    m_ui->top_left_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->top_right_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->bottom_left_graph->addWidget(chartView);
    m_charts << chartView;

    chartView = new QChartView(createChart());
    m_ui->bottom_right_graph->addWidget(chartView);

    m_charts << chartView;
}

我在模式改变之间调用函数clearMode,这里是:

void ThemeWidget::clearMode() {
    if (!m_charts.isEmpty()) {
        m_ui->top_left_graph->removeWidget(m_charts[0]);
        m_ui->top_right_graph->removeWidget(m_charts[1]);
        m_ui->bottom_left_graph->removeWidget(m_charts[2]);
        m_ui->bottom_right_graph->removeWidget(m_charts[3]);
        m_charts.clear();
    }
}

一开始我打电话给renderModeGraph,一切都在渲染,布局很好,一切都很好。但是当我改变模式布局结构时流走了。我是 qt 和 c++ 的新手,所以不明白发生了什么以及如何解决这个问题,请帮助或提供建议以重组布局。

这里还有布局结构和一些截图。

【问题讨论】:

  • 为什么你有两个完全一样的函数?
  • 真的不明白为什么你会一直放弃图表视图只是为了在以后重新创建它们。直接exchange当前显示的图表不是更高效吗?
  • 哦,不知道有没有这样的功能,谢谢(ps是随机生成的,所以不一样)但是如果我想替换为不图表小部件怎么办?
  • 那么你可能需要更新布局(它有一个同名的函数)。可能,您可能想选择一个更合适的布局管理器?我个人更喜欢只创建一次小部件,让它们保持并行,并隐藏不需要的小部件。 QStackedWidgetQStackedLayout 提供方便的方式。
  • 谢谢,我会去找他们的。

标签: c++ qt qt5


【解决方案1】:

问题在于您有一个布局,并且每次删除一个小部件时,布局都会发生变化。因此,每次更改小部件时都需要修复它。要消除此问题,您可以使用包含图表小部件的 QWidget 容器创建基本 UI。每次更改小部件时,不是删除 QWidget 容器,而是删除图表并保留 QWidget。然后创建新的小部件并将其放入 QWidget。这样你的布局应该保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多