У меня есть QScrollArea с некоторыми кнопками в нем, как показано на картинке. QScrollArea с динамически меняющимся содержимым
Идея макета: 1. Кнопка влево и вправо следует использовать для прокрутки кнопок, когда они слишком широки
2. количество кнопок в области прокрутки можно изменить динамически 3. Любое свободное пространство должно использоваться, чтобы максимально расширить область прокрутки. Если такое пространство не существует, кнопки навигации должны использоваться для прокрутки.
С моей текущей реализации, когда я увеличиваю кнопки у меня есть это:
Но есть свободное пространство справа, так что это должно выглядеть следующим образом:
Если я увеличить еще раз 10, например, должна появиться полоса прокрутки (потому что макет установлен в виде виджета).
Я хочу знать, есть ли другой путь в стороне от ручного изменения размера виджетов (потому что пользовательский интерфейс может быть переведен и кнопки можно изменить размер намек также реальная конструкция сложнее :(
Вот моя реализация виджета ScrollAreaTest:
#include "MainWidget.h"
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QScrollArea>
#include <QPushButton>
#include <QDebug>
#include "ButtonWidget.h"
#include "CheckableButtonGroup.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent),
m_scrollArea(0),
m_lineEdit(0),
m_buttons(0)
{
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QWidget* firstRow = new QWidget;
QHBoxLayout* firstRowLayout = new QHBoxLayout(firstRow);
QPushButton* left = new QPushButton;
QPushButton* right = new QPushButton;
m_buttons = new CheckableButtonGroup(Qt::Horizontal);
m_buttons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
m_buttons->setButtonsCount(5);
m_buttons->setStyleSheet("border: none");
QWidget* const buttonsContainer = new QWidget;
QHBoxLayout* const buttonsContainerLayout = new QHBoxLayout(buttonsContainer);
buttonsContainerLayout->setSpacing(0);
buttonsContainerLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
buttonsContainerLayout->setMargin(0);
buttonsContainerLayout->addWidget(m_buttons, 0, Qt::AlignLeft);
qDebug() << m_buttons->buttons()[ 0 ]->size();
m_scrollArea = new QScrollArea;
m_scrollArea->setContentsMargins(0, 0, 0, 0);
m_scrollArea->setWidget(buttonsContainer);
m_scrollArea->setWidgetResizable(true);
m_scrollArea->setStyleSheet("border: 1px solid blue");
m_scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
firstRowLayout->addWidget(left , 0, Qt::AlignLeft);
firstRowLayout->addWidget(m_scrollArea, 1, Qt::AlignLeft);
firstRowLayout->addWidget(right , 0, Qt::AlignLeft);
m_lineEdit = new QLineEdit;
QPushButton* button = new QPushButton;
QHBoxLayout* secondRowLayout = new QHBoxLayout;
secondRowLayout->addWidget(m_lineEdit);
secondRowLayout->addWidget(button);
connect(button, SIGNAL(clicked()), SLOT(setButtonsCount()));
mainLayout->addWidget(firstRow, 1, Qt::AlignLeft);
mainLayout->addLayout(secondRowLayout);
button->setText("Set buttons count");
buttonsContainer->resize(m_buttons->buttonsOptimalWidth(), buttonsContainer->height());
m_buttons->resize(m_buttons->buttonsOptimalWidth(), m_buttons->height());
//area->resize(100, area->height());
//area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
MainWidget::~MainWidget()
{
}
void MainWidget::setButtonsCount()
{
m_buttons->setButtonsCount(m_lineEdit->text().toInt());
}
А вот весь проект Qt, содержащий проблему: https://drive.google.com/file/d/0B-mc4aKkzWlxQzlPMEVuNVNKQjg/edit?usp=sharing
У меня аналогичная прокрутки-область и мне было просто интересно, если это возможно, чтобы эти нажимные кнопки расположены 4 кнопки/строку (как я увидел приведенный выше пример). [?] –
@groenhen Уверен, что можно устроить их так, как вы хотите. –
Уже сделано. Теперь я пытаюсь выяснить способ получить однострочный пробел, я хочу пропустить одну строку и поместить новые кнопки после этого «виртуального» пространства ... –