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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Многооконное приложение и геометрия окон  (Прочитано 9878 раз)
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
Гость
« Ответ #1 : Август 19, 2017, 20:12 »

Убрать рамки.
Вы их не учитываете, потому у вас всё и сбоит.

А перемещать, изменять геометрию вам придётся самим.
Записан
alik
Гость
« Ответ #2 : Август 19, 2017, 20:24 »

Убрать рамки.
Вы их не учитываете, потому у вас всё и сбоит.

А перемещать, изменять геометрию вам придётся самим.
А как называется соответствующая опция? Где ее искать?
В редакторе форм на объектах типа QDialog не нахожу свойства frameShape !
Записан
Bepec
Гость
« Ответ #3 : Август 19, 2017, 20:55 »

А его нету в дизайнере. В дизайнере вообще дофига чего нету.
Зато есть Qt::FramelessWindowHint, в setFlags().

PS дизайнер тут скорее инструмент для грубой настройки - накидал, основные свойства задал, а более точная настройка только в коде Улыбающийся
Записан
alik
Гость
« Ответ #4 : Август 19, 2017, 22:24 »

А его нету в дизайнере. В дизайнере вообще дофига чего нету.
Зато есть 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
Гость
« Ответ #5 : Август 19, 2017, 22:53 »

Выложите минимальный работоспособный проект и я посмотрю.
И да, есть тег код - такая # в последней строчке.

PS а код выкладывать архивом, желательно с про файлом Улыбающийся Программисты ленивый народ :/
PPS если страшно за наработки, можете мне в личку послать Улыбающийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #6 : Август 20, 2017, 00:55 »

В флаги надо Qt::Window добавить скорее всего.
Записан
alik
Гость
« Ответ #7 : Август 20, 2017, 09:50 »

В флаги надо Qt::Window добавить скорее всего.
Не помогло
Записан
Bepec
Гость
« Ответ #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
Гость
« Ответ #9 : Август 20, 2017, 21:05 »

Код:
    

[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
Гость
« Ответ #10 : Август 20, 2017, 21:07 »

Пользуйтесь уже тегом [ CODE ][ /code ], это кнопочка со значком "#".
Пользуйтесь на здоровье, только учтите что время загрузки на слабых системах может отличаться и вы получите ту же кашу, что и в начале.

PS если уж нужны заголовки, то получайте их размер платформозависимыми функциями.
Записан
alik
Гость
« Ответ #11 : Август 20, 2017, 21:20 »

Пользуйтесь уже тегом [ CODE ][ /code ], это кнопочка со значком "#".
Пользуйтесь на здоровье, только учтите что время загрузки на слабых системах может отличаться и вы получите ту же кашу, что и в начале.

PS если уж нужны заголовки, то получайте их размер платформозависимыми функциями.
Научился пользоваться тегом ))
Записан
alik
Гость
« Ответ #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 Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #13 : Август 20, 2017, 22:00 »

А можно еще вопрос?

Использую QVBoxLayout для создания палитры цветов с надписями.
Не могу добиться, чтобы разрыв между объектами QLineEdit (цветами) был нулевым.
Маргин ставлю 0.
Цитировать

setSpacing(0)
Записан

alik
Гость
« Ответ #14 : Август 21, 2017, 10:59 »

А можно еще вопрос?

Использую QVBoxLayout для создания палитры цветов с надписями.
Не могу добиться, чтобы разрыв между объектами QLineEdit (цветами) был нулевым.
Маргин ставлю 0.
Цитировать

setSpacing(0)

Я ставил это условие  color_scales_Layout->setSpacing(0);
Не помогло.

Перешел от QLineEdit к QLabel и получилось разместить элементы впритык, как и хотел.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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