Russian Qt Forum
Март 28, 2024, 14:06
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Многооконное приложение и геометрия окон
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Многооконное приложение и геометрия окон (Прочитано 8881 раз)
alik
Гость
Многооконное приложение и геометрия окон
«
:
Август 19, 2017, 19:24 »
Здравствуйте уважаемые форумчане!
Я совсем недавно начал писать программу на QT и стокнулся с пока еще не решаемыми для себя проблемами.
Мой проект многокоонный. Он представляет собой смесь MDI и SDI. То есть открывается сначала основное окно MainWindow, занимая определенный кусок места на экране, далее ниже открывается другое дочернее окно, с такой же шириной, еще позже открывается третее второстепенное окно ниже второго и с такой же шириной. Все три окна прижаты к левому или правому краю экрана.
1) Проблема связана с тем, что когда создаются классы вторичных окна их геометрия не такая, как после отображения окон и поэтому я не могу точно выстроить окна один по другим по всей высоте экрана.
2) Можно ли выравнивать эти окна по типу Layout-ов ?
Получается либо наложение окон друг на друга краями, либо разрыв между ними.
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QRect screenGeometry = QApplication::desktop()->screenGeometry();
int MainWinWidth = 240;
int MainWinHeight = 120;
this->setWindowTitle("Main Window");
this->setFixedSize(MainWinWidth, MainWinHeight);
this->move(screenGeometry.width() - this->width(), screenGeometry.top());
this->show();
QRect MainWinRect = this->geometry();
int VerWinHeight = 300;
fVerSec = new VerticalSection(this);
fVerSec->setWindowTitle(tr("Vertical Section"));
fVerSec->resize(this->width(), VerWinHeight);
fVerSec->move(this->geometry().left(), this->geometry().top() + this->height() - 1);
fVerSec->show();
flist_vsf = new list_vsf(this);
flist_vsf->setWindowTitle(tr("Scans"));
flist_vsf->resize(this->width(), screenGeometry.height() - fVerSec->geometry().top() - fVerSec->height());
flist_vsf->move(this->geometry().left(), fVerSec->geometry().top() + fVerSec->geometry().height());
flist_vsf->show();
}
«
Последнее редактирование: Август 19, 2017, 19:46 от alik
»
Записан
Bepec
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #1 :
Август 19, 2017, 20:12 »
Убрать рамки.
Вы их не учитываете, потому у вас всё и сбоит.
А перемещать, изменять геометрию вам придётся самим.
Записан
alik
Гость
Re: Многооконное приложение и геометрия око
«
Ответ #2 :
Август 19, 2017, 20:24 »
Цитата: Bepec от Август 19, 2017, 20:12
Убрать рамки.
Вы их не учитываете, потому у вас всё и сбоит.
А перемещать, изменять геометрию вам придётся самим.
А как называется соответствующая опция? Где ее искать?
В редакторе форм на объектах типа QDialog не нахожу свойства frameShape !
Записан
Bepec
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #3 :
Август 19, 2017, 20:55 »
А его нету в дизайнере. В дизайнере вообще дофига чего нету.
Зато есть Qt::FramelessWindowHint, в setFlags().
PS дизайнер тут скорее инструмент для грубой настройки - накидал, основные свойства задал, а более точная настройка только в коде
Записан
alik
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #4 :
Август 19, 2017, 22:24 »
Цитата: Bepec от Август 19, 2017, 20:55
А его нету в дизайнере. В дизайнере вообще дофига чего нету.
Зато есть Qt::FramelessWindowHint, в setFlags().
PS дизайнер тут скорее инструмент для грубой настройки - накидал, основные свойства задал, а более точная настройка только в коде
сделал так:
fVerSec = new VerticalSection(this);
fVerSec->setWindowTitle(tr("Vertical Section"));
fVerSec->setWindowFlags(Qt::FramelessWindowHint);
fVerSec->show();
flist_vsf = new list_vsf(this);
flist_vsf->setWindowTitle(tr("Volume Scans List"));
flist_vsf->setWindowFlags(Qt::FramelessWindowHint);
flist_vsf->show();
В итоге оба дочерних окна не отрисовываются на экране !?
Записан
Bepec
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #5 :
Август 19, 2017, 22:53 »
Выложите минимальный работоспособный проект и я посмотрю.
И да, есть тег код - такая # в последней строчке.
PS а код выкладывать архивом, желательно с про файлом
Программисты ленивый народ :/
PPS если страшно за наработки, можете мне в личку послать
Записан
break
Гипер активный житель
Offline
Сообщений: 846
Re: Многооконное приложение и геометрия окон
«
Ответ #6 :
Август 20, 2017, 00:55 »
В флаги надо Qt::Window добавить скорее всего.
Записан
alik
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #7 :
Август 20, 2017, 09:50 »
Цитата: break от Август 20, 2017, 00:55
В флаги надо Qt::Window добавить скорее всего.
Не помогло
Записан
Bepec
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #8 :
Август 20, 2017, 17:19 »
Код:
QRect MainWinRect = this->geometry();
//int VerWinHeight = 300;
fVerSec = new VerticalSection(this);
fVerSec->setWindowTitle(tr("Vertical Section"));
fVerSec->move(screenGeometry.width() - fVerSec->width(),this->geometry().bottom());
fVerSec->setWindowFlags(fVerSec->windowFlags() | Qt::FramelessWindowHint);
//fVerSec->show();
flist_vsf = new list_vsf(this);
flist_vsf->setWindowTitle(tr("Volume Scans List"));
flist_vsf->move(screenGeometry.width() - flist_vsf->width(),fVerSec->geometry().bottom());
flist_vsf->setWindowFlags(flist_vsf->windowFlags() | Qt::FramelessWindowHint);
flist_vsf->set_parent_container(Container);
flist_vsf->update_vsf_list();//Container->Config.Data.PathToDir.Archive);
//flist_vsf->show();
InitMainMenu();
После мучений с VM убунты, пары крашей фс и болтайки с bzlib2, всё же запустил
PS заголовков лишаемся, зато получаем попиксельное управление окнами. Правда нужно будет ещё перенос организовать самим.
Если такой вариант не устраивает, то милости просим в дебри убунты - получение текущих размеров рамок, заголовкой, и потом уже рассчитывать.
«
Последнее редактирование: Август 20, 2017, 17:21 от Bepec
»
Записан
alik
Гость
Re: Многооконное приложение и геометрия око
«
Ответ #9 :
Август 20, 2017, 21:05 »
Цитата: Bepec от Август 20, 2017, 17:19
Код:
[code]
QRect MainWinRect = this->geometry();
//int VerWinHeight = 300;
fVerSec = new VerticalSection(this);
fVerSec->setWindowTitle(tr("Vertical Section"));
fVerSec->move(screenGeometry.width() - fVerSec->width(),this->geometry().bottom());
fVerSec->setWindowFlags(fVerSec->windowFlags() | Qt::FramelessWindowHint);
//fVerSec->show();
flist_vsf = new list_vsf(this);
flist_vsf->setWindowTitle(tr("Volume Scans List"));
flist_vsf->move(screenGeometry.width() - flist_vsf->width(),fVerSec->geometry().bottom());
flist_vsf->setWindowFlags(flist_vsf->windowFlags() | Qt::FramelessWindowHint);
flist_vsf->set_parent_container(Container);
flist_vsf->update_vsf_list();//Container->Config.Data.PathToDir.Archive);
//flist_vsf->show();
InitMainMenu();
После мучений с VM убунты, пары крашей фс и болтайки с bzlib2, всё же запустил
PS заголовков лишаемся, зато получаем попиксельное управление окнами. Правда нужно будет ещё перенос организовать самим.
Если такой вариант не устраивает, то милости просим в дебри убунты - получение текущих размеров рамок, заголовкой, и потом уже рассчитывать.
Спасибо большое! Это работает!
После мытарств сделал с заголовками окон через таймеры:
Код:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
....
//--- work screen size without statusbar ---
QRect screenGeometry = QApplication::desktop()->screenGeometry();
int MainWinWidth = 240;
int MainWinHeight = 120;
this->setFixedSize(MainWinWidth, MainWinHeight);
this->move(0, 0); //this->move(screenGeometry.width() - this->width(), screenGeometry.top());
this->show();
//--- window of vertical section ---
fVerSec = new VerticalSection(this);
//**fVerSec->setWindowFlags(fVerSec->windowFlags() | Qt::FramelessWindowHint);
fVerSec->setWindowTitle(tr("Vertical Section"));
//--- window of list of scan files ---
flist_vsf = new list_vsf(this);
flist_vsf->setWindowTitle(tr("Volume Scans List"));
flist_vsf->set_parent_container(Container);
flist_vsf->update_vsf_list();//Container->Config.Data.PathToDir.Archive);
QTimer::singleShot(50, this, SLOT(adjustVerSecGeometry()));
...
}
void MainWindow::adjustVerSecGeometry()
{
int VerWinHeight = 300;
fVerSec->resize(this->width(), VerWinHeight);
fVerSec->move(this->geometry().left(), this->geometry().bottom() + 1);
fVerSec->show();
//flist_vsf->show();
QTimer::singleShot(50, this, SLOT(adjustListVsfGeometry()));
}
void MainWindow::adjustListVsfGeometry()
{
QRect screenGeometry = QApplication::desktop()->screenGeometry();
flist_vsf->resize(this->width(), screenGeometry.height() - fVerSec->geometry().bottom() - 1);
flist_vsf->move(this->geometry().left(), fVerSec->geometry().bottom() + 1);
flist_vsf->show();
QTimer::singleShot(50, this, SLOT(adjustListVsfGeometry2()));
}
[/code]
«
Последнее редактирование: Август 20, 2017, 21:19 от alik
»
Записан
Bepec
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #10 :
Август 20, 2017, 21:07 »
Пользуйтесь уже тегом [ CODE ][ /code ], это кнопочка со значком "#".
Пользуйтесь на здоровье, только учтите что время загрузки на слабых системах может отличаться и вы получите ту же кашу, что и в начале.
PS если уж нужны заголовки, то получайте их размер платформозависимыми функциями.
Записан
alik
Гость
Re: Многооконное приложение и геометрия окон
«
Ответ #11 :
Август 20, 2017, 21:20 »
Цитата: Bepec от Август 20, 2017, 21:07
Пользуйтесь уже тегом [ CODE ][ /code ], это кнопочка со значком "#".
Пользуйтесь на здоровье, только учтите что время загрузки на слабых системах может отличаться и вы получите ту же кашу, что и в начале.
PS если уж нужны заголовки, то получайте их размер платформозависимыми функциями.
Научился пользоваться тегом ))
Записан
alik
Гость
Re: Многооконное приложение и геометрия око
«
Ответ #12 :
Август 20, 2017, 21:27 »
А можно еще вопрос?
Использую QVBoxLayout для создания палитры цветов с надписями.
Не могу добиться, чтобы разрыв между объектами QLineEdit (цветами) был нулевым.
Маргин ставлю 0.
Код:
void TMap::adjust_colorscale2()
{
QWidget *widget_color_scale2 = new QWidget(ui->widget_aaaaa);
QPalette palette;
QBrush brush;
brush.setStyle(Qt::SolidPattern);
for (int i = 0; i < MapScale->ScaleLen; ++i)
{
color_scales[i] = new QLineEdit(widget_color_scale2);
color_scales[i]->setText(MapScale->ArrCaptions[i]);
color_scales[i]->setAlignment(Qt::AlignCenter);
color_scales[i]->setFrame(false);
brush.setColor(MapScale->ArrColors[i]);
palette.setBrush(QPalette::Active, QPalette::Base, brush);
palette.setBrush(QPalette::Inactive, QPalette::Base, brush);
palette.setBrush(QPalette::Disabled, QPalette::Base, brush);
color_scales[i]->setPalette(palette);
}
QVBoxLayout *color_scales_Layout = new QVBoxLayout(widget_color_scale2);
for (int i = 0; i < MapScale->ScaleLen; ++i)
{
color_scales_Layout->addWidget(color_scales[i]);
}
color_scales_Layout->setMargin(0);
color_scales_Layout->setSpacing(0);
}
«
Последнее редактирование: Август 20, 2017, 21:29 от alik
»
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Многооконное приложение и геометрия око&#
«
Ответ #13 :
Август 20, 2017, 22:00 »
Цитата: alik от Август 20, 2017, 21:27
А можно еще вопрос?
Использую QVBoxLayout для создания палитры цветов с надписями.
Не могу добиться, чтобы разрыв между объектами QLineEdit (цветами) был нулевым.
Маргин ставлю 0.
Цитировать
setSpacing(0)
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
alik
Гость
Re: Многооконное приложение и геометрия око&#
«
Ответ #14 :
Август 21, 2017, 10:59 »
Цитата: gil9red от Август 20, 2017, 22:00
Цитата: alik от Август 20, 2017, 21:27
А можно еще вопрос?
Использую QVBoxLayout для создания палитры цветов с надписями.
Не могу добиться, чтобы разрыв между объектами QLineEdit (цветами) был нулевым.
Маргин ставлю 0.
Цитировать
setSpacing(0)
Я ставил это условие color_scales_Layout->setSpacing(0);
Не помогло.
Перешел от QLineEdit к QLabel и получилось разместить элементы впритык, как и хотел.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...