Qt: Невозможно напрямую добавить полосу прокрутки к виджету с детьми - PullRequest
0 голосов
/ 19 сентября 2018

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

1. Какдобавить полосу прокрутки к родительскому QWidget

2. Вставить полосу прокрутки в виджет qt с помощью qtcreator

3. Добавление полосы прокрутки в Qwidget

4. QScrollArea отсутствует полоса прокрутки

Но большинство ответов устанавливают компоновку для виджета, для которого мы добавляем полосу прокрутки.

Моя проблема:

Виджет, для которого мне нужна полоса прокрутки, содержит много дочерних виджетов. Но я не добавил к ней никакого макета. Геометрия дочерних виджетов модифицируема, и поэтому яЯ не добавил макет в родительский виджет.

Ниже приведен мой код:

class Absolute : public QWidget {

public:
 Absolute(QWidget *parent = 0);
};

Absolute::Absolute(QWidget *parent)
 : QWidget(parent) {

QTextEdit *ledit = new QTextEdit(this);
ledit->setGeometry(5, 5, 500, 550);

QTextEdit *lledit = new QTextEdit(this);
lledit->setGeometry(510, 5, 250, 550);

/*QScrollArea* sa = new QScrollArea();
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
auto *widget = new QWidget(this);
sa->setWidget(widget);

auto *l = new QVBoxLayout(this);
l->setMargin(0);
l->addWidget(sa);*/
}

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

Absolute window;
window.setWindowTitle("Absolute");
window.setGeometry(500,500,1500,1000);
window.show();

return app.exec();
}

Однако без кода полосы прокрутки (закомментированная часть) пользовательский интерфейс размещает эти текстовые сообщения в заданной позиции.как установлено в setGeometry.

Все, что мне нужно, это принести свитокбар, если ширина 2-го текстового сообщения больше.

Поэтому я попытался добавить полосу прокрутки (закомментированную часть). Однако я могу видеть только полосу прокрутки, а не текстовые сообщения.

Любое предложение / входные данные будутбыть действительно полезным. Спасибо заранее !!

1 Ответ

0 голосов
/ 19 сентября 2018

Причина

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

Решение

Создание правильной иерархии родитель / потомок и установкажелаемый размер виджета QScrollArea.Нет необходимости устанавливать макет для этого виджета.

Пример

Вот пример, который я подготовил для вас, чтобы продемонстрировать, как вы можете исправить Absolute:

class Absolute : public QWidget {
public:
    Absolute::Absolute(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        auto *sa = new QScrollArea(this);
        auto *l = new QVBoxLayout(this);
        auto *widget = new QWidget();
        auto *ledit = new QTextEdit(widget);
        auto *lledit = new QTextEdit(widget);

        sa->setWidgetResizable(true);
        sa->setWidget(widget);
        sa->setAlignment(Qt::AlignLeft | Qt::AlignTop);

        ledit->setGeometry(5, 5, 500, 550);
        lledit->setGeometry(510, 5, 250, 550);

        widget->setFixedSize(lledit->geometry().right(), lledit->geometry().bottom());

        l->setMargin(0);
        l->addWidget(sa);
    }
};

Примечание: В демонстрационных целях размер widget установлен на (lledit->geometry().right(), lledit->geometry().bottom()).Вы можете настроить его в соответствии с вашими потребностями.

...