小能豆

QTQTQScrollArea滑动窗口中动态添加两个不同的子控件

javascript

QWidget scrollWidget = new QWidget;
ui->scrollArea->setWidget(scrollWidget);
QGridLayout
layout = new QGridLayout;
scrollWidget->setLayout(layout);
layout->setGeometry(QRect(0, 0, ui->scrollArea->viewport()->width(), ui->scrollArea->viewport()->height()));

/*使用一个循环来创建多个Plotted对象。
  • 在每次循环中,创建一个新的Plotted对象tted,

  • 设置Plotted对象的位置和大小,并将其添加到布局中。/
    for (int i = 0; i < offset; i++) {
    if (Type == 1) {
    Plotted
    tted = new Plotted;
    tted->setMinimumSize(QSize(400, 300));
    layout->addWidget(tted, i / 3, i % 3);
    } else if (Type == 2) {
    Quote *quote = new Quote;
    quote->setMinimumSize(QSize(400, 300));

```rust
// 创建一个新的布局,并将子控件添加到该布局中
QHBoxLayout *quoteLayout = new QHBoxLayout;
quoteLayout->addWidget(quote);

   // 将新的布局添加到主布局中
   layout->addLayout(quoteLayout, i / 3, i % 3);

}
```

}
ui->scrollArea->setWidgetResizable(true);这串代码在QTQScrollArea滑动窗口中动态添加两个不同的子控件时,第一个添加的子控件会变成第二个添加的子控件。应该怎么解决???


阅读 38

收藏
2024-06-22

共1个答案

小能豆

在你的代码中,创建多个不同类型的子控件时,第一个添加的子控件会变成第二个添加的子控件。这可能是因为你在循环中使用相同的布局 QGridLayout,并且在某些情况下可能是因为子控件的布局管理不当,导致布局重叠或被覆盖。

这里有一个改进的版本,确保每个子控件在添加到 QGridLayout 时不会覆盖其他控件。

改进后的代码

QWidget *scrollWidget = new QWidget;
ui->scrollArea->setWidget(scrollWidget);
QGridLayout *layout = new QGridLayout;
scrollWidget->setLayout(layout);

// 使用一个循环来创建多个Plotted和Quote对象。
for (int i = 0; i < offset; i++) {
    if (Type == 1) {
        Plotted *tted = new Plotted;
        tted->setMinimumSize(QSize(400, 300));
        layout->addWidget(tted, i / 3, i % 3);
    } else if (Type == 2) {
        Quote *quote = new Quote;
        quote->setMinimumSize(QSize(400, 300));

        // 直接将Quote对象添加到布局中
        layout->addWidget(quote, i / 3, i % 3);
    }
}
ui->scrollArea->setWidgetResizable(true);

解释与注意事项

  1. 动态添加子控件
  2. 在循环中创建不同类型的子控件 PlottedQuote
  3. 使用 QGridLayout::addWidget 将子控件添加到 QGridLayout 中,确保每个控件添加到不同的网格位置。

  4. 子控件的最小大小

  5. 通过 setMinimumSize 设置每个子控件的最小大小,确保它们在网格中占据适当的空间。

  6. 子布局管理

  7. 在原代码中,将 Quote 放入 QHBoxLayout 并添加到 QGridLayout 可能导致布局混乱。改进后的代码直接将 Quote 添加到 QGridLayout,避免了多层布局可能引发的问题。

  8. 确保网格布局的正确性

  9. 确保 i / 3i % 3 的计算正确,将控件均匀地分布在网格中。

运行检查

  1. 调试和检查布局
  2. 在运行时通过调试和检查确保每个控件被正确添加到网格中。
  3. 检查控件的布局属性,确保每个控件都在预期的位置。

  4. 调整布局参数

  5. 根据需要调整网格布局的参数(如行间距、列间距)以获得最佳布局效果。

通过以上调整,可以确保不同类型的子控件不会互相覆盖,并且在 QScrollArea 中动态添加多个控件时,布局显示正确。

2024-06-22