Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переключение режима компоновки 
:(
    Опции темы
Aline
Дата 17.6.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Необходимо на форму выложить 3 любых виджета и скомпоновать их по горизонтали. Добавить кнопку, по нажатию на которую надо менять компоновку с горизонтальной на вертикальную и обратно, как это сделать правильно?
Не работает так, как сделала:
Код

QVBoxLayout *layout1 = new QVBoxLayout(this);
  if (flHorizont)
  {
      ui->horizontalLayout->removeWidget(ui->label);
      layout1->addWidget(ui->label);

      ui->horizontalLayout->removeWidget(ui->textEdit);
      layout1->addWidget(ui->textEdit);

      ui->horizontalLayout->removeWidget(ui->comboBox);
      layout1->addWidget(ui->comboBox);

      setLayout(layout1);
      flHorizont = false
  }

PM MAIL   Вверх
bsa
Дата 17.6.2013, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(Aline @  17.6.2013,  14:04 Найти цитируемый пост)
Не работает так, как сделала:
Что значит "не работает"? А что происходит? Что в консоль отладки сыпится?
Чтобы заменить дефолтный layout у виджета, необходимо удалить старый. Когда ты делаешь new VBoxLayout(this) ты пытаешься установить новый дефолтный layout: http://qt-project.org/doc/qt-4.8/qwidget.html#setLayout
PM   Вверх
Aline
Дата 17.6.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, ничего не сыпется,просто ничего не меняется на форме. Вот я понимаю,что надо удалить старый,а как это сделать?
PM MAIL   Вверх
bsa
Дата 17.6.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Aline, прочитай документацию, ссылку на которую я дал. Там черным по белому написано, что нужно сделать.
PM   Вверх
Aline
Дата 17.6.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, я читаю, но может чего то не вижу или не понимаю?
Написано: You must first delete the existing layout manager (returned by layout()) before you can call setLayout() with the new layout.
Хорошо, но как?
В примере это не показано:
Код

 QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(formWidget);
     setLayout(layout);


То же самое делается и у меня в программе
PM MAIL   Вверх
bsa
Дата 17.6.2013, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Код
delete this->layout();
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(formWidget);

Разве не очевидно?
PM   Вверх
Aline
Дата 17.6.2013, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa: В первую очередь вы должны удалить существующий лэйаут ( возвращаемый layout()) прежде чем вы сможете вызвать setLayout() с новым лэйаутом.

Т.е. я так понимаю lyaout() вернет то, что сейчас активно и этот лэйаут надо удалить. Но покажите мне где написано, каким образом удалять? Или я тупая? Я только знакомлюсь с Qt, соответственно много еще не знаю

Добавлено через 6 минут и 2 секунды
bsa, 
Цитата(bsa @  17.6.2013,  15:19 Найти цитируемый пост)
Разве не очевидно? 

мне нет smile
PM MAIL   Вверх
Aline
Дата 17.6.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, так тоже не работает smile
PM MAIL   Вверх
bsa
Дата 17.6.2013, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Aline, тогда выкладывай полностью минимальный код, который позволит воспроизвести проблему. Ты уверена, что у тебя вообще выполняются эти действия? Отладчиком проходила?
PM   Вверх
Aline
Дата 17.6.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



кстати

this->layout() 

ничего не возвращает и в окне ,где показываются величины, пишет, что <no such value>

Если я напрямую ставлю 

delete ui->horizontalLayout;

то тоже не работает.

Дело в том, что компановка только для 3-х элементов ( у меня это Label, EditText , ComboBox), компановки на основном окне нет.

Добавлено через 3 минуты и 45 секунд
bsa, да выполняются, там нечему выполняться
Сильно не смеяться, вот с этим я пытаюсь эксперементировать: 

Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

bool flHorizont = true;
QVBoxLayout *layoutV;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton, &QPushButton::clicked,this, &MainWindow::onChange);
    layoutV = new QVBoxLayout(this);
}

void MainWindow::onChange()
{
  if (flHorizont)
  {
      ui->horizontalLayout->removeWidget(ui->label);
      ui->horizontalLayout->removeWidget(ui->textEdit);
      ui->horizontalLayout->removeWidget(ui->comboBox);

      delete this->layout();

      layoutV->addWidget(ui->label);
      layoutV->addWidget(ui->textEdit);
      layoutV->addWidget(ui->comboBox);

      this->setLayout(layoutV);
      flHorizont = false;
  }
  else{


  }
}

MainWindow::~MainWindow()
{
    delete ui;
}



На форме 3 элемента, про которые написала выше, объединенные горизонтальной компоновкой, и кнопка лежит отдельно от них

Добавлено через 5 минут и 8 секунд
в данном случае, после выполнения кода внутри if  выходит сообщение:"Приложение остановлено, так как оно получило сигнал от операционной системы"
PM MAIL   Вверх
bsa
Дата 17.6.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



ох
ну ты и намудрила.
Код
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
//bool flHorizont = true; //это перенеси в тело класса

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    flHorizontal(false)
{
    new QVBoxLayout(this); //если сделаешь в дизайнере компоновку по-вертикали, то можешь убрать эту строку
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked), SLOT(onChange));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onChange()
{
  flHorizont = !flHorizont;
  QLayout *l = flHorizont ? new QHBoxLayout : new QVBoxLayout;
  l->addWidget(ui->label);
  l->addWidget(ui->textEdit);
  l->addWidget(ui->comboBox);
  delete layout();
  setLayout(l);
}

PM   Вверх
Aline
Дата 17.6.2013, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, да,я могу ;)
но суть то от этого не изменилась?
PM MAIL   Вверх
Aline
Дата 18.6.2013, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, всё равно не работает smile

Во-первых на строке 
Код

QLayout *l = flHorizont ? new QHBoxLayout : new QVBoxLayout;


выдает ошибку: 

D:\WORK\QT projects\zadanie8\mainwindow.cpp:40: ошибка: conditional expression between distinct pointer types 'QHBoxLayout*' and 'QVBoxLayout*' lacks a cast

Убрала это, написала условие через If. Проходит до конца процедуры,а потом выдает всё ранво ошибку:"Приложение остановлено, так как оно получило сигнал от операционной системы" 

PM MAIL   Вверх
bsa
Дата 18.6.2013, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Aline, запусти под отладчиком. И смотри где упадет.
PM   Вверх
Aline
Дата 18.6.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



bsa, ну вот здесь сразу падает:

Код

QLayout *l = flHorizont ? new QHBoxLayout : new QVBoxLayout;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.