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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слой в докВиджете  (Прочитано 3083 раз)
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.051 секунд. Запросов: 18.