首页 新闻 会员 周边

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

0
悬赏园豆:20 [待解决问题]

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));

         // 创建一个新的布局,并将子控件添加到该布局中
         QHBoxLayout *quoteLayout = new QHBoxLayout;
         quoteLayout->addWidget(quote);
    
         // 将新的布局添加到主布局中
         layout->addLayout(quoteLayout, i / 3, i % 3);
     }
    

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

咖啡没方糖的主页 咖啡没方糖 | 初学一级 | 园豆:177
提问于:2023-10-25 18:41
< >
分享
所有回答(1)
0

在你的代码中,你尝试在QScrollArea中动态添加不同的子控件(Plotted和Quote),但存在一个问题。这是因为在两种情况下,你都使用了同一个QGridLayout作为布局,而在同一个位置添加不同类型的控件会导致后一个控件覆盖前一个控件。

为了解决这个问题,你可以考虑以下方法:

使用不同的布局:为每种类型的子控件创建不同的布局,然后将这些布局添加到QGridLayout中。这样可以确保不同类型的子控件不会相互覆盖。例如:
cpp
Copy code
for (int i = 0; i < offset; i++) {
if (Type == 1) {
Plotted *tted = new Plotted;
tted->setMinimumSize(QSize(400, 300));
QVBoxLayout *ttedLayout = new QVBoxLayout;
ttedLayout->addWidget(tted);
layout->addLayout(ttedLayout, i / 3, i % 3);
} else if (Type == 2) {
Quote *quote = new Quote;
quote->setMinimumSize(QSize(400, 300));
QVBoxLayout *quoteLayout = new QVBoxLayout;
quoteLayout->addWidget(quote);
layout->addLayout(quoteLayout, i / 3, i % 3);
}
}
使用不同的子控件容器:你可以为不同类型的子控件创建不同的QWidget容器,然后将容器添加到QGridLayout中。这将确保子控件不会相互覆盖。例如:
cpp
Copy code
for (int i = 0; i < offset; i++) {
if (Type == 1) {
Plotted *tted = new Plotted;
tted->setMinimumSize(QSize(400, 300));
QWidget *ttedContainer = new QWidget;
QVBoxLayout *ttedLayout = new QVBoxLayout(ttedContainer);
ttedLayout->addWidget(tted);
layout->addWidget(ttedContainer, i / 3, i % 3);
} else if (Type == 2) {
Quote *quote = new Quote;
quote->setMinimumSize(QSize(400, 300));
QWidget *quoteContainer = new QWidget;
QVBoxLayout *quoteLayout = new QVBoxLayout(quoteContainer);
quoteLayout->addWidget(quote);
layout->addWidget(quoteContainer, i / 3, i % 3);
}
}
这两种方法都可以确保不同类型的子控件不会相互覆盖,并且可以按照你的期望方式显示在QScrollArea中。

Technologyforgood | 园豆:7199 (大侠五级) | 2023-10-28 21:57

你好,代码改过以后在QScrollArea滑动窗口中用QPushButton来添加不同的子控件,每次点击PushButton时已经添加到滑动窗口中的子控件会被最后添加的子控件进行覆盖掉
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()));
for (int i = 0;i < offset; i++){
if(Type == 1){
Plotted *tted = new Plotted;
tted->setMinimumSize(QSize(400,300));
QWidget *ttedContainer = new QWidget;
QVBoxLayout *ttedLayout = new QVBoxLayout(ttedContainer);
ttedLayout->addWidget(tted);
//layout->addWidget(ttedContainer,i/3,i%3);

    }else if(Type == 2){
        Quote *quote = new Quote;
        quote->setMinimumSize(QSize(400,300));
        QWidget *quoteContainer = new QWidget;
        QVBoxLayout *quoteLayout = new QVBoxLayout(quoteContainer);
        quoteLayout->addWidget(quote);
        //layout->addWidget(quoteContainer,i/3,i%3);
    }

}


ui->scrollArea->setWidgetResizable(true);
支持(0) 反对(0) 咖啡没方糖 | 园豆:177 (初学一级) | 2023-10-30 13:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册