Russian Qt Forum
Декабрь 27, 2024, 13:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает layout в DockWidget-е  (Прочитано 6057 раз)
SpiritFire
Гость
« : Декабрь 10, 2009, 12:05 »

Подскажиет, пожалуйста, как правильно создавать лейауты и засовывать в них виджеты?

Создаю свой виджет, в конструкторе сразу задаю пять кнопок в вертикальном лейауте:

Код:
PluginListWidget::PluginListWidget(QWidget* parent)
  : QDockWidget(parent)
  , m_layout   (NULL)
{
     QPushButton *button1 = new QPushButton("One",   this);
     QPushButton *button2 = new QPushButton("Two",   this);
     QPushButton *button3 = new QPushButton("Three", this);
     QPushButton *button4 = new QPushButton("Four",  this);
     QPushButton *button5 = new QPushButton("Five",  this);

     m_layout = new QVBoxLayout(this);
     m_layout->addWidget(button1);
     m_layout->addWidget(button2);
     m_layout->addWidget(button3);
     m_layout->addWidget(button4);
     m_layout->addWidget(button5);

     this->setLayout(m_layout);
}

Запускаю, получаю следующую картину, 5 кнопок одна на одной, все с координатами (0,0), на изменение размера виджета лейаут не реагирует.

Открываю справку, смотрю пример, делаю так же у себя:
Код:
PluginListWidget::PluginListWidget(QWidget* parent)
  : QDockWidget(parent)
  , m_layout   (NULL)
{
     QPushButton *button1 = new QPushButton("One");
     QPushButton *button2 = new QPushButton("Two");
     QPushButton *button3 = new QPushButton("Three");
     QPushButton *button4 = new QPushButton("Four");
     QPushButton *button5 = new QPushButton("Five");

     m_layout = new QVBoxLayout();
     m_layout->addWidget(button1);
     m_layout->addWidget(button2);
     m_layout->addWidget(button3);
     m_layout->addWidget(button4);
     m_layout->addWidget(button5);

     setLayout(m_layout);
}

Получаю следующую картину: пустой виджет, никаких кнопок.

Qt 4.5.3. Пример "Basic Layouts Example" работает, как и следовало ожидать вполне нормально. Но опять же скопипастеный оттуда код, принципиально не отличающийся от приведенного выше дает все тот же результат: пустое окно.

Да, при выполнении этого кода в отладочный вывод выводится такое предупреждение:
Цитировать
Запускается D:\Qt_projects\pluginTest\bin\test.exe...
QWidget::setLayout: Attempting to set QLayout "" on QDockWidget "", which already has a layout

Уточнение: Более никаких методов класса PluginListWidget не переопределено. Из окна-родителя (которым является QMainWidget) также никаких методов касающихся данного виджета не вызывается.
« Последнее редактирование: Декабрь 10, 2009, 12:36 от SpiritFire » Записан
BRE
Гость
« Ответ #1 : Декабрь 10, 2009, 12:10 »

Потому что ты это делаешь на QDockWidget'е. Посмотри документацию по этому классу.

Нужно создать свой виджет, положить на него 5 кнопок + layout и его положить на QDockWidget:
void QDockWidget::setWidget ( QWidget * widget )
Записан
SpiritFire
Гость
« Ответ #2 : Декабрь 10, 2009, 12:29 »

Спасибо за очень оперативный ответ, действительно, проблема в том, что не туда смотрел в документации. Прочел. Изучил пример "Dock Widgets Example".

В результате вышел вот такой код:
Код:
PluginListWidget::PluginListWidget(QWidget* parent)
  : QDockWidget(parent)
  , m_layout   (NULL)
{
    QWidget*     newWidget  = new QWidget(this);

    m_layout = new QVBoxLayout(newWidget);
    newWidget->setLayout(m_layout);
    this->setWidget(newWidget);

    QPushButton* button1 = new QPushButton("One",   newWidget);
    QPushButton* button2 = new QPushButton("Two",   newWidget);
    QPushButton* button3 = new QPushButton("Three", newWidget);
    QPushButton* button4 = new QPushButton("Four",  newWidget);
    QPushButton* button5 = new QPushButton("Five",  newWidget);

    m_layout->addWidget(button1);
    m_layout->addWidget(button2);
    m_layout->addWidget(button3);
    m_layout->addWidget(button4);
    m_layout->addWidget(button5);

    newWidget->show();
}

Который снова ничего не выводит на экран. Удаление-добавление парентов в конструкторах дочернего виджета, лейаута и кнопок не дают никакого эффекта... Что-то снова не так.
Вызов newWidget->setLayout(m_layout); В конце конструктора тоже ничего не дает.

Никаких предупреждений ни во время выполнения в отладочный ваывод, ни во время компиляции не выводится.
Записан
BRE
Гость
« Ответ #3 : Декабрь 10, 2009, 12:46 »

Возьми designer, добавь QDockWidget, на него свои кнопки, установи layout и посмотри, что он генерирует. Руками подчистить и использовать. Самое простое решение, на мой взгляд. Улыбающийся
Записан
SpiritFire
Гость
« Ответ #4 : Декабрь 10, 2009, 12:57 »

странно, я создавал виджет как QDockWidget в дизайнере, далее "Promoute to..." и свой класс. Ничего не отображалось.

Попробовал добавлять динамически в конструкторе главного окна - и все отлично заработало с таким кодом, как указано в моем предыдущем посте, с тем лишь отличиями, что пришлось руками вызвать mainWindow->addDockWidget(...);
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Декабрь 10, 2009, 18:34 »

если я правильно помню, надо сначала добавить виджеты в лайаут, а потом уже назначать лайаут виджету
Записан
Dendy
Гость
« Ответ #6 : Декабрь 11, 2009, 04:48 »

Я бы писал так:

Код:
PluginListWidget::PluginListWidget(QWidget* parent)
  : QDockWidget(parent)
  , m_layout   (NULL)
{
    QWidget * newWidget  = new QWidget;
    QLayout * layout = new QVBoxLayout(newWidget);

    QPushButton* button1 = new QPushButton("One");
    QPushButton* button2 = new QPushButton("Two");
    QPushButton* button3 = new QPushButton("Three");
    QPushButton* button4 = new QPushButton("Four");
    QPushButton* button5 = new QPushButton("Five");

    m_layout->addWidget(button1);
    m_layout->addWidget(button2);
    m_layout->addWidget(button3);
    m_layout->addWidget(button4);
    m_layout->addWidget(button5);

    setWidget(newWidget);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.247 секунд. Запросов: 23.