Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Динамическое создание компонентов


Автор: HomerJSimpsoN 5.2.2012, 19:23
Суть вопроса следующая:

В БД хранится таблица, которая описывает количество полей, их заголовок и имя на форме.
Есть форма. Точнее - формы нет. Она создается динамически.
На эту форму посредством setLayout() я кладу QVBoxLayout. Далее на него начинаю класть с помощью addWidget() предварительно созданный компонент в соответствии с описанием в БД.
К сожалению этот компонент не появляется и выводится чистая формочка.
Привожу текст процедуры
Код

QDialog *PatientDialog::CreateDialog(QString tabName)
{
    // Генерируем диалог создания карточки пациента
    QWidget *w = new QWidget();
    QDialog *d = new QDialog(w);

    QSizePolicy sizePolicy;
    sizePolicy.setVerticalPolicy(QSizePolicy::Policy::Fixed);
    sizePolicy.setHorizontalPolicy(QSizePolicy::Policy::Fixed);

    d->setSizePolicy(sizePolicy);

    d->setGeometry(100, 100, 800, 600);

    QScrollBar *scrollBar = new QScrollBar(Qt::Orientation::Vertical, w);

    QVBoxLayout *l = new QVBoxLayout(w);

    QFont font;
    font.setPointSize(10);

    int x = 10, y = 10;

    // Теперь запросим все нужные поля для данного диалога
    dbaseQuery->exec("SELECT a.FieldText, a.FieldType, a.FieldName FROM"
                     " TableDescription a WHERE a.TableName='" + tabName + "';");

    while( dbaseQuery->next() )
    {
        // Создадим поле
        // с именем - именем колонки,
        // и поместим его на форму

        // Сначала создадим надпись
        QLabel *label = new QLabel(w);
        label->setFont(font);
        label->setText(dbaseQuery->value(0).toString());
        label->update();
        label->setVisible(true);
        l->addWidget(label);
        l->update();
    }

    w->setLayout(l);
    return d;
}

Я явно что то упускаю. 
Прошу помощи =)
Заранее спасибо!

Автор: HomerJSimpsoN 5.2.2012, 19:57
Хммм))
Ответ - найден. Там нужно вызывать дополнительно метод show() к главному виджету окна.
Появился другой вопрос из этой же оперы =)

У меня динамически создается форма, туда закидывается некоторое число компонентов.
Это число, с одной стороны, может быть достаточно велико, посему, чтобы избежать наложения их друг на друга, я создаю скролл бар. 
С другой стороны - это число может быть и 1 - 2. Размер формы - не важен, т.е. тоже от очень небольшой, до всего экрана.
На данный момент я создал QHBoxLayout, засунул туда справа скролл бар, а слева - QVBoxLayout. В последний - пихаю компоненты.
Как сами понимаете, получается не очень красиво.
Посему прошу подсказать, какой компонент-компоновщик лучше использовать для этого дела... Чтоб его еще и можно было привязать к скролл бару и скроллить вниз-вверх к недуступным объектам...
Желательно подсказать, как еще и привязку осуществить ^_^
Спасибо!

Автор: _GRIN_ 6.2.2012, 18:36
Убери свой скролбар.
Изначальный компонент запихни в QScrollArea

Автор: HomerJSimpsoN 6.2.2012, 18:38
Спасибо.
Проблему решил, буквально минут 15 назад...
Всего лишь навсего забыл изменить размер слоя, на который кладу элементы =)
Глупо =(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)