Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совместное использование QDockWidget и QDialog. 
:(
    Опции темы
OlegIT
Дата 21.6.2013, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создал форму диалог, связываю его с QDockWidget функцией  setCentralWidget(Wd);. Диалог отображается, но его размер остаётся фиксированным, какие бы флаги в sizePolicy я не ставил. Как сделать, что бы размер диалога и все элементы в этом диалоге были «привязаны» к размеру главного окна?

QDockWidget мне не очень подходит, дочерние окна на нём жёстко «привязаны» флагами к определённому месту, у меня получилось «привязаться» максимум к левой и верхней границам. Как сделать, что бы эти дочерние окна можно было перемещать как в MS Visual Studio с инструментом управления размещения как на прикреплённом рисунке и сохранять эту конфигурацию при следующих запусках? Как я понимаю должно прийти сообщение, что позиция дочернего окна изменилась, и она стала такой-то.


Это сообщение отредактировал(а) OlegIT - 21.6.2013, 12:58

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  EC.PNG 6,61 Kb
PM MAIL   Вверх
math64
Дата 21.6.2013, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Делай форму унаследованную от QWidget. Её можно в зависимости от надобностей поместить в QDialog или в QDockWidget.
PM   Вверх
OlegIT
Дата 21.6.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(math64 @  21.6.2013,  11:07 Найти цитируемый пост)
Делай форму унаследованную от QWidget. Её можно в зависимости от надобностей поместить в QDialog или в QDockWidget. 

Не понял как? Простая замена базового класса с QDialog на QWidget не возможна, в ui_xxx.h используются функции из QDialog. Можно чуть подробнее.
PM MAIL   Вверх
Guinness
Дата 21.6.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(OlegIT @  21.6.2013,  14:32 Найти цитируемый пост)
 Простая замена базового класса с QDialog на QWidget не возможна, в ui_xxx.h используются функции из QDialog. 

Ну так есть файл *.ui. В нём есть тэг:
Код

<widget class="QDialog" name="MyDialog">

Вот поменяйте QDialog на QWidget.
PM MAIL   Вверх
OlegIT
Дата 21.6.2013, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Guinness @  21.6.2013,  13:36 Найти цитируемый пост)
Вот поменяйте QDialog на QWidget. 

Каким образом? Напрямую редактирование *.ui запрещено, в редакторе форм способа выбрать базовый класс тоже не вижу.
PM MAIL   Вверх
math64
Дата 21.6.2013, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Не совсем так. Потребуются ещё изменения. Лучше при создании формы указать базовым классом QWidget.
Получите кроме файла формы form.ui ещё form.cpp и form.h, ui_form.h, где объявлены классы Ui::Form и Form : public QWidget. Добавьте классы FormDialog : public QDialog и FormDock : public QDockWidget, в конструкторе которых создаётся виджет Form вставляется в диалог или доквиджет центральным виджетом. Возможны варианты.
PM   Вверх
OlegIT
Дата 25.6.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Получил диалог-форму от QWidget.

Код

class CentralDialog : public QWidget
{
    Q_OBJECT
    
public:
    explicit CentralDialog(QWidget *parent = 0);
    ~CentralDialog();
    
private:
    Ui::CentralDialog *ui;
};

Соединяю QDockWidget с CentralDialog
Код

    setCentralWidget(CentralDialog);
    CentralDialog->show();


Но, опять же размеры CentralDialog не меняются. Что-то я не доделываю.
Не понял откуда берутся «FormDialog : public QDialog и FormDock : public QDockWidget» FormDialog это мой CentralDialog, а FormDock это тот объект из которого setCentralWidget вызывается?
PM MAIL   Вверх
math64
Дата 25.6.2013, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Для CentralDialog задай minimumWidth и minimumHeight - тогда размер QDockWidget будет не меньше этих размеров.
Производные классы от QDockWidget и QDialog можно не создавать - это только вопрос удобства.
Можно так:
Код

class CentralDialog : public QWidget
{
    Q_OBJECT
    
public:
    explicit CentralDialog(QWidget *parent = 0);
    ~CentralDialog();
   QDockWidget* createDockWidget(QMainWindow* mw,int width, int heght) {
     setMinimumWidth(width);
     setMinimumHeight(height);
     QDockWidget* dock = new QDockWidget(mw);
     dock->setCentralWidget(this);
     dock->show();
     return dock;
   }
   QDialog* createDialog(); // Аналогично
private:
    Ui::CentralDialog *ui;
};

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


Опытный
**


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

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



Сам диалог "следит" за размерами QDockWidget. Но теперь не получается заставить следить за размерами диалога элементы управления в этом диалоге. У меня сейчас там два элемента QTableView и QTreeView. Использовал QBoxLayout, результат не изменился.

Ещё нужно центрировать QLabel относительно диалога.

Это сообщение отредактировал(а) OlegIT - 26.6.2013, 14:19
PM MAIL   Вверх
math64
Дата 27.6.2013, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Кликни в дизайнере на свободное место в виджете. Выбери соответствующий лейаут в панели инструментов. Размеры таблицы и дерева увеличится до размеров виджета с учётом марджинов - если они слишком большие, их можно уменьшить. При изменении размеров виджета размеры таблицы и дерева будут изменяться соответственно. При необходимости для них тоже нужно задать минимальные размеры.

Добавлено через 2 минуты и 6 секунд
Метка сама умеет выравниваться по центру - задай соответствующий alignment.
PM   Вверх
OlegIT
Дата 28.6.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Размеры таблицы и дерева включённые в лайаут "следят" за размерами этого лайаута, а размеры лайаута остаются постоянными.
PM MAIL   Вверх
OlegIT
Дата 2.7.2013, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил задачу так

Код

void CentralWidget::resizeEvent(QResizeEvent *Rs)
{
    QSize Sz = Rs->size();
    ui->horizontalLayoutWidget->setFixedSize(Sz.width()-5,Sz.height());
}


А без кода обойтись не получится? Внутренних средств виджета, лайаута для таких действий нет?

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Если хоть раз установлен фиксированный размер - то да, его нужно будет изменять вручную.
У горизонтального лейаута можно настроить размеры полей, промежутков между виджетами и веса виджетов.
Если размеры виджетов изменялись вручную с помощью мышки, их можно запомнить в конфигурации программы.

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

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

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


 




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


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

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