crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Динамическое размещение элементов формы., изменение размеров формы при удалении элемента
fe120
  опции профиля:
сообщение 30.1.2010, 13:12
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


Доброго времени суток.
На своем этапе развития экспериментирую с созданием и уничтожением элементов на форме. Не использую qt designer. В качестве руководства используется Макс Шлее - QT Профессиональное программирование на C++, и соответственно принципы создания элементов описанных в этой книге.

Так вот к сути:
Есть функция создания слоя и помещения слоя в QGroupBox
Раскрывающийся текст
void Mainform::createSelect(){
    showRecordBox = new QGroupBox(trUtf8("Просмотр записей:"));
    loginButton = new QPushButton(trUtf8("Тут логин"));
    passwordButton = new QPushButton(trUtf8("Тут пароль"));
    selectLayout = new QGridLayout;
    selectLayout->setSpacing(2);
    selectLayout->setMargin(0);
    selectLayout->setAlignment(Qt::AlignTop);
    selectNameBox = new QComboBox;
    selectNameBox->setMinimumWidth(120);
    selectNameBox->addItem("lol");
    selectNameBox->addItem("lol2");
    selectNameBox->addItem("lol3");
    namesLabel = new QLabel(trUtf8("Название:"));
    loginLabel = new QLabel(trUtf8("Логин:"));
    passLabel = new QLabel(trUtf8("Пароль:"));
    showAnyInform = new QCheckBox(trUtf8("Доп. информация"));
    [b]connect(showAnyInform,SIGNAL(toggled(bool)),SLOT(changeStateShowAnyInform()));[/b]

    selectLayout->addWidget(namesLabel,0,0,1,1);
    selectLayout->addWidget(selectNameBox,0,1,1,1);
    selectLayout->addWidget(loginLabel,1,0,1,1);
    selectLayout->addWidget(loginButton,1,1,1,1);
    selectLayout->addWidget(passLabel,2,0,1,1);
    selectLayout->addWidget(passwordButton,2,1,1,1);
    selectLayout->addWidget(showAnyInform,3,0,1,2);
    showRecordBox->setMaximumWidth(showRecordBox->width());
    showRecordBox->setLayout(selectLayout);
}

сигнал (showAnyInform,SIGNAL(toggled(bool)) связан со следующей функцией:

Раскрывающийся текст
void Mainform::changeStateShowAnyInform(){
    if(showAnyInform->isChecked()) {
        formSize=showRecordBox->size();
        anyInformation = new QTextEdit;
        selectLayout->addWidget(anyInformation,4,0,1,2);
    }
    else {selectLayout->removeWidget(anyInformation);anyInformation->~QTextEdit();}
}

Итогом всего этого является следующее:


Игрался с resize(int,int), с showRecordBox->adjustSize(), showRecordBox->sizeHint(), безрезультатно, форма не принимает исходных размеров. В чем ошибка и как наиболее правильнее будет реализовать подобное.
Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.1.2010, 14:12
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Самое простое решение:
вызывай adjustSize() самого окна, для регулировки размера
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 30.1.2010, 14:45
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Не в тему:
1.
Цитата(fe120 @ 30.1.2010, 13:12) *
anyInformation->~QTextEdit();

Не вызывай напрямую деструктор, он не освобождает память. Для этого есть delete (он вызывает деструктор и освобождает память).
2. В твоем случае нет необходимости постоянно создавать/удалять QTextEdit. Пользуйся методами show()/hide().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fe120
  опции профиля:
сообщение 31.1.2010, 0:21
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 6.1.2010
Пользователь №: 1354

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ох. 2 ответа и оба в точку. Премного благодарен.

А вообще создания формы чисто средствами кодинга, без drag and drop'ывания элементов, это моветоном еще не считается?
Или так сказать будующее за qt designer и qml?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.1.2010, 0:42
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fe120 @ 31.1.2010, 3:21) *
А вообще создания формы чисто средствами кодинга, без drag and drop'ывания элементов, это моветоном еще не считается?
в доке по Qt сказано, что компоновщики были придуманы для облегчения создания графического интерфейса именно в коде

Цитата(fe120 @ 31.1.2010, 3:21) *
Или так сказать будующее за qt designer и qml?
поживём увидим, пока QML очень сырой
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 31.1.2010, 16:02
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(fe120 @ 31.1.2010, 0:21) *
qt designer и qml?


У них совершенно разное направление. QML никогда не заменит обычные создание приложений на виджетах. Это как сравнить Style Sheets с QPainter'ом. Если без стилей можно обойтись, то без QPainter'a нет. То, что ты не можешь сделать с помощью стилей ты можешь реализовать сам. QML это скрипт, который позволяет манипулировать базовыми элементами сцены используя её функционал без необходимости писать всё на С++ через методы и классы. Если подумать, то QML мог бы быть как .ui файлы, в виде xml'я, а для него был бы аналогичный компилятор типа uic, который бы превращал xml в С++ код с классами для QGraphicsView. Вместо яваскрипа были бы сигналы, которые бы связывались со слотами на C++. Но смысл то ведь в том, что это декларативный подход - глаза не видят, а руки делают. Презентации наверно удобно было бы делать. Работать с мультимедией. Короче это всё-равно что выбрать игровой 3D движок для создания бухгалтерской программы, где тебе нужно зачистить деревню повстанцев, а в конце миссии тебе отдадут годовой отчет. Кстати этот подход мне ужасно не нравится в Mass Effect 2. Там есть космический корабль, капитаном которого ты являешься, так вот, чтобы изучить какой-то апгрейд или просто рубашку сменить нужно пробежать пол корабля в свою кабину или другой отсек, на лифте туда сюда поездить. Очень раздражает, что нет единого меню откуда можно было бы всё сделать без необходимости пол минуты ждать пока загрузится палуба на которую ты приехал, чтобы посмотреть свои achievements. Вот и QML такой же, пол жизни тратишь на просмотр анимации растворения, перемещения, вместо того, чтобы получить моментальный результат.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 7:46