Использование пользовательского класса Qt в области прокрутки и принудительное изменение размера элементов, но отображение полосы прокрутки

#c #qt

#c #qt

Вопрос:

Я пытался решить эту проблему в течение нескольких дней, но я не добился никакого прогресса, я думаю, что я что-то упускаю, пожалуйста, помогите мне ее решить.

В mainwindow я создал область прокрутки и придал ей вертикальное расположение. Я создал класс Qt Designer (myform.h, myform.cpp и myform.ui) и разместите несколько кнопок вертикальное расположение.

Это «myform.ui»: http://oi59.tinypic.com/23sch2r.jpg

Я хочу, чтобы область прокрутки в mainwindow содержала «myform.ui», а элементы в «myform.ui» не изменялись бы, но вместо этого в области прокрутки появлялись полосы прокрутки.

Мой mainwindow.cpp является

 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myform.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    MyForm* myform = new MyForm(this);
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(myform);

    ui->scrollArea->setWidgetResizable(false);
    ui->scrollArea->setLayout(layout);

}

MainWindow::~MainWindow()
{
    delete ui;
}
 

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

Изображение: http://oi62.tinypic.com/w83xvp.jpg

Это всего лишь минимальный пример, иллюстрирующий проблему, с которой я столкнулся.

Ответ №1:

Согласно документации для QScrollArea, похоже, вам нужно установить фоновый виджет в область прокрутки. Этот код взят непосредственно из документации QScrollArea виджета:

 QLabel *imageLabel = new QLabel;
QImage image("happyguy.png");
imageLabel->setPixmap(QPixmap::fromImage(image));

scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);
 

Создается метка изображения. В него загружается растровое изображение. Затем виджет области прокрутки определяется setWidget() командой.

В вашем коде я думаю, что ui->scrollArea->setLayout(layout);

должно быть

ui->scrollArea->setWidget(layout); вместо этого.

Примечание: я не тестировал этот код, но думаю, что он решит вашу проблему.