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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слой в докВиджете  (Прочитано 2938 раз)
Disa
Гость
« : Январь 20, 2012, 10:58 »

Добрый день снова. Продалжаю ковыряться в Qt, с переодическими натыканиями на грабли Грустный
В общем почему-то не отображает слой (который по строкам) в док виждете:

Инициализация док виджета:
Код
C++ (Qt)
dock = new QDockWidget(tr("Terminal editor"), this);
dock->setAllowedAreas(Qt::RightDockWidgetArea);
...
terminal_editor = new terminalEditor(dock);
 
dock->setWidget     (terminal_editor);
dock->setFeatures   (QDockWidget::NoDockWidgetFeatures);
dock->setFixedHeight(256);
 
addDockWidget(Qt::RightDockWidgetArea, dock);
 

Конструктор класса terminal_editor:
Код
C++ (Qt)
idLineEdit = new QLineEdit;
idLineEdit->setFocus();
idLineEdit->setText("Enter id here");
 
LoadButton = new QPushButton(tr("Test"));
 
QFormLayout *terminal_editor_layout = new QFormLayout;
 
terminal_editor_layout->addRow(tr("New id:"), idLineEdit);
terminal_editor_layout->addWidget(LoadButton);
 
setFeatures(NoDockWidgetFeatures);
setLayout(terminal_editor_layout);
 

Без введения слоя - либо кнопку, либо линию отображает правильно. Но с добавлением какого-либо варианта компановки по слоям - отказывается (пробовал еще некоторые варианты, писал основываясь на исходниках о слоях с сайта для разработчиков Нокии)

Спасибо!
« Последнее редактирование: Январь 20, 2012, 15:49 от Disa » Записан
Disa
Гость
« Ответ #1 : Январь 20, 2012, 15:49 »

Попробовал вот так, тоже ничего кроме пустого тулбара Грустный

Код
C++ (Qt)
void MainWindow::createDockWindows() {
 dock = new QDockWidget(tr("Terminal viewer"), this);
 dock->setAllowedAreas(Qt::RightDockWidgetArea);
 dock->setFeatures    (QDockWidget::NoDockWidgetFeatures);
 
 terminal_viewer_image = new QLabel(dock);
 terminal_viewer_text  = new QLabel(dock);
 
 QFormLayout *dock_widget_layout = new QFormLayout;
 
 dock_widget_layout->addRow(tr("terminal image"), terminal_viewer_image);
 dock_widget_layout->addRow(tr("terminal info"),  terminal_viewer_text);
 
 dock->setLayout(dock_widget_layout);
 addDockWidget(Qt::RightDockWidgetArea, dock);
 
}

MainWindow наследован от QMainWindow, но не уверен что это может играть роль. Доквиджет есть, внутрених слоев нет Грустный
Записан
Witcher
Гость
« Ответ #2 : Январь 23, 2012, 00:10 »

Случаем не под Windows кодишь?

Просто в линукс все норм, а в виндовс такая же фигня. Доквиджет либо отрывать приходиться. либо панель(или groupbox) ставить, а поверх уже то что нужно.
Это чисто мои наблюдения,возможно ошибаюсь
Записан
Disa
Гость
« Ответ #3 : Январь 23, 2012, 08:40 »

Под MacOs 10.6.
Пока в процессе гугления проблемы, потому что даже с QFormLayout как нужно что-то не выходит, а пихать все по отдельности (кнопки, редакторы картинок и прочее) в QDockWidget не хочется, тк получается какая-то кривая логика.  
Записан
Disa
Гость
« Ответ #4 : Январь 23, 2012, 09:19 »

Проблема решилась при внимательном перечитывании документации (грешен переодической невнимательностью).
Если кому интеренсно смысл следующий:
QDockWidget является оберткой для дочерних виджетов:
Цитировать
A QDockWidget acts as a wrapper for its child widget, set with setWidget(). Custom size hints, minimum and maximum sizes and size policies should be implemented in the child widget. QDockWidget will respect them, adjusting its own constraints to include the frame and title. Size constraints should not be set on the QDockWidget itself, because they change depending on whether it is docked; a docked QDockWidget has no frame and a smaller title bar.

И вследствии этого не может отображать полноценно слой, тк тот же QFormLayout является детём QLayout.
Решение (по мне так это хак): Сделать накой-нибудь QWidjet (QFrame например), в него засовывать слой и потом отображать в доквиджете:
Код
C++ (Qt)
QFrame *f = new QFrame       (this);
QFormLayout *l = new QFormLayout(f);
 
_w1   = new QLabel(w1);
_w2   = new QLabel(w2);
_dock = new QDockWidget(tr("_dock"), this);
 
_dock->addRow(tr("_w1"), _w1);
_dock->addRow(tr("_w2"), _w2);
 
_dock->setWidget     (*f);
_dock->setFeatures   (QDockWidget::NoDockWidgetFeatures);
 addDockWidget(Qt::RightDockWidgetArea, _dock);

Такое решение проблемы правда вызывает небольшие проблемы с моими сигналами и слотами, но ничего Улыбающийся
« Последнее редактирование: Январь 23, 2012, 09:28 от Disa » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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