Проблема вызвана предположением, что существует какой-либо механизм, который автоматически изменяет размер виджетов за вас. Нет. QScrollArea
действует как барьер макета, и любые макеты внутри него изолированы от его размера и, следовательно, от любых событий изменения размера.
Вы должны изменить размер виджета контейнера (тот, у которого синий набросайте схему на диаграмме) каждый раз, когда область прокрутки меняет размер, и вам сначала нужно подготовить тестовый пример для виджетов, чтобы их изменения размера правильно управлялись при размещении в выбранном вами макете, а указанный макет изменял размер.
Наконец, моя любимая мозоль: маловероятно, что QMainWindow
вам действительно понадобится для чего-нибудь. Это просто глупый шаблон Qt Creator. Но если вам не нужен интерфейс MDI и стыковка, вам не следует использовать QMainWindow
- и особенно при создании автономного примера. Все, что вам нужно здесь, это QScrollArea
как виджет верхнего уровня. Буквально все. Любой QWidget
может быть окном верхнего уровня!
Для будущих отправок предоставьте весь необходимый код в одном файле main.cpp
, который начинается с #include <QtWidgets>
и заканчивается на #include "main.moc"
. Вам не понадобятся какие-либо другие включения для классов Qt, и вы можете писать определения классов в стиле Java со всеми методами, определенными в самом объявлении класса. Это обеспечивает сокращенный код - в конце концов, вопрос SO - это не корпоративный проект. Он должен быть минимальным, а это действительно означает, что все ненужное нужно удалить. Нет необходимости в файлах заголовков, множественных включениях и прочей ерунде - то есть используйте контейнеры Qt вместо C ++ STL, чтобы вам не требовалось больше включений et c.
Ваш пример должен выглядеть примерно так:
#include <QtWidgets>
class PolygonButtonWidget : public QAbstractButton {
Q_OBJECT
/* without seeing the code here, your question is unanswerable */
};
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
QWidget root;
QHBoxLayout layout{&root};
PolygonButtonWidget buttons[10];
for (auto &button : buttons)
layout.addWidget(&button);
QScrollArea view;
view.setWidget(&root);
view.show();
app.exec();
view.takeWidget();
}
#include "main.moc"
Без такого примера на ваш вопрос сложно ответить, так как:
Как мы можем отладить его? Отладка означает использование отладчика. Если ваш код не может быть немедленно скомпилирован, то маловероятно, что кто-то потрудится отладить его, а отладка путем проверки часто подвержена ошибкам.
Как мы можем предоставить проверенный ответ, если мы Придется ли сначала написать для него весь «тестовый пример»?
Как мы можем узнать, что внутри вашего виджета-кнопки? Поведение этого виджета действительно влияет на окончательное решение.
Было бы также полезно, если бы вы описали несколько вариантов использования, которые, как вы ожидаете, будут работать. То есть смоделируйте (с помощью рисунка) состояние виджетов до и после изменения размера представления, чтобы мы могли легко увидеть, что именно должно произойти. Многие из них очень легко упустить, объясняя свои потребности словами. Варианты использования - это язык спецификаций программного обеспечения . Если вы их не используете, весьма вероятно, что вы сами не знаете, какое поведение вы ожидаете во всех случаях.