C ++ Qt Как добавить виджеты в область прокрутки? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь показать пользовательские виджеты в области прокрутки, но он показывает только последний.

Содержимое области прокрутки должно динамически меняться с индексом поля со списком, и они изменяются и показывают последний элементтоже.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    fileMenu = ui->menuBar->addMenu(tr("&Archivo"));
    openFileAction = new QAction(tr("Abir archivo"), this);
    connect(openFileAction,
            SIGNAL(triggered()),
            this,
            SLOT(openFile()));
    fileMenu->addAction(openFileAction);


    scroll = ui-> scrollArea;
    scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    scroll->setWidgetResizable(true);


    ui->stackedWidget->setCurrentIndex(0);
}

vector<product> MainWindow::filter(QString cad)
{
    vector <product> tempList;
    QMessageBox message;
    for(size_t i(0);i<products.size();i++){
        if(products.at(i).getId().contains(cad)){
            product *p = new product;
            p->setId(products.at(i).getId());
            p->setName(products.at(i).getName());
            p->setPrice(products.at(i).getPrice());
            tempList.push_back(*p);
        }
    }
    return tempList;
}

void MainWindow::loadproducts(int category){
    QMessageBox message;
    vector <product> tempList;
    switch(category){

    case Alimentos:{
        tempList=filter("AB");
        break;
        }

    case Libros:{
        tempList=filter("L");
        break;
        }

    case Electronicos:{
        tempList=filter("E");
        break;
        }

    case Hogar:{
        tempList=filter("HC");
        break;
        }

    case Deporte:{
        tempList=filter("D");
        break;
        }

    case Todos:{
        tempList=products;
        break;
        }

    default:{
        break;
        }
    }

//THIS FOR IS SUPPOSED TO ADD WIDGETS TO SCROLL AREA

    for(size_t i=0;i<tempList.size();i++){
        ProductWidget *p = new ProductWidget(widget, tempList.at(i).getId(), tempList.at(i).getName(), tempList.at(i).getPrice());
        scroll->setWidget(p);
    }

    tempList.clear();
}

В области прокрутки должно отображаться 10 виджетов, но отображается только последний.

1 Ответ

1 голос
/ 07 октября 2019

Вы можете установить виджет в QScrollArea только с помощью метода setWidget (), если добавится другой, он заменит предыдущий. Если вы хотите показать несколько виджетов, вы должны поместить их все в виджет, и последний виджет установил его в QScrollArea. Например, в вашем случае:

// ...
QWidget *container = new QWidget;
scroll->setWidget(container);
QVBoxLayout *lay = new QVBoxLayout(container);

for(size_t i=0;i <tempList.size(); i++){
    ProductWidget *p = new ProductWidget(...);
    lay->addWidget(p);
}
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...