Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переключение режима компоновки 
:(
    Опции темы
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   Вверх
bsa
Дата 18.6.2013, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Aline, ты сказала, что заменила на if. По идее, данная строка должна была превратиться в:
Код
QLayout *l;
if (flHorizont)
   l = new QHBoxLayout;
else
   l = new QVBoxLayout;

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


Опытный
**


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

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



bsa, да, я так делала, в этом случае доходит до конца процедуры. Далее отладчик попападает в ассемблеровский код и вот здесь вылетает:

Function: QListData::isEmpty() const
0xb16658  <+0x0000>         push   %ebp
0xb16659  <+0x0001>         mov    %esp,%ebp
0xb1665b  <+0x0003>         sub    $0x4,%esp
0xb1665e  <+0x0006>         mov    %ecx,-0x4(%ebp)
0xb16661  <+0x0009>         mov    -0x4(%ebp),%eax
0xb16664  <+0x000c>         mov    (%eax),%eax
0xb16666  <+0x000e>         mov    0xc(%eax),%edx
PM MAIL   Вверх
bsa
Дата 18.6.2013, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Aline, стек смотри. Возможно по нему можно будет определить где возникла проблема. А уже из этого понять, как ее исправить.
Попробуй переписать код так:
Код
#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;
  if (flHorizont)
     l = new QHBoxLayout;
  else
     l = new QVBoxLayout;
  delete layout();
  setLayout(l);
  l->addWidget(ui->label);
  l->addWidget(ui->textEdit);
  l->addWidget(ui->comboBox);
}

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


Опытный
**


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

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



Цитата(bsa @  18.6.2013,  11:13 Найти цитируемый пост)
стек смотри

а как его смотреть?

Добавлено через 8 минут и 1 секунду
Цитата(bsa @  18.6.2013,  11:13 Найти цитируемый пост)
Попробуй переписать код так:

на это дало ошибку , но уже в другом месте
        Function: QListData::size() const
0xd46614  <+0x0000>         push   %ebp
0xd46615  <+0x0001>         mov    %esp,%ebp
0xd46617  <+0x0003>         sub    $0x4,%esp
0xd4661a  <+0x0006>         mov    %ecx,-0x4(%ebp)
0xd4661d  <+0x0009>         mov    -0x4(%ebp),%eax
0xd46620  <+0x000c>         mov    (%eax),%eax
0xd46622  <+0x000e>         mov    0xc(%eax),%edx
PM MAIL   Вверх
Aline
Дата 18.6.2013, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати, вот такой вариат :

Код

flHorizont = !flHorizont;

    if (flHorizont) ui->horizontalLayout->setDirection(QBoxLayout::LeftToRight);
    else ui->horizontalLayout->setDirection(QBoxLayout::TopToBottom);


вообще без проблем работает smile Но я не знаю насколько это правильно. В смыле насколько соответствует заданному заданию.
PM MAIL   Вверх
bsa
Дата 18.6.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


Опытный
**


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

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



bsa, всё задание в первом сообщении на 1-й странице. Больше ничего нет. Дело в том, что мне просто дали видео с лекции, к нему очень (ну очень) краткий конспект и вот эти задания. Сказали, что так быстрее обучаться. Тонкости по заданию я не знаю, т.к. на лекции не присутствовала smile
Вот здесь можно посмотреть http://www.zmartzoft.ru/projects/qtinception/wiki/day1
PM MAIL   Вверх
bsa
Дата 18.6.2013, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


Опытный
**


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

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



bsa, ну всё равно интересно почему не работает?smile Наверное что то происходит с элементами
PM MAIL   Вверх
bsa
Дата 18.6.2013, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


Опытный
**


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

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



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


Эксперт
****


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

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



Aline, но там не указано, что компоновщик должен быть самостоятельным. Если ты нажмешь правой кнопкой на форме и добавишь компоновщик, то это тоже будет "скомпоновать".
PM   Вверх
Aline
Дата 19.6.2013, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bsa, но я так поняла, что компануются именно 3 любых элемента,а затем уже отдельно добавляется кнопка, не так?
PM MAIL   Вверх
bsa
Дата 20.6.2013, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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


 




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


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

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