Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Larry от Март 01, 2016, 15:32



Название: [РЕШЕНО]Боковая панель
Отправлено: Larry от Март 01, 2016, 15:32
Добрый день.
Подскажите, как можно расположить панель (Qwidget) на другом виджете? Есть QWebView и поверх него необходимо располагать панели, которые можно скрыть и т.д. и т.п. Можно ли будет сверху него расположить другие виджеты?


Название: Re: Боковая панель
Отправлено: kambala от Март 01, 2016, 15:45
QWebView — виджет, а на любой виджет можно наложить другой виджет. QWidget *panel = new QWidget(webView);


Название: Re: Боковая панель
Отправлено: Larry от Март 01, 2016, 15:54
Спасибо, протупил :)


Название: Re: Боковая панель
Отправлено: Larry от Март 01, 2016, 16:29
Попробовал вот так, но виджета нет. QDockPanel наследник от QFrame, где есть два виджета header и panel:
Код:
m_dockpanel = new QDockPanel(ui->wvViewMap);
m_dockpanel->setGeometry(100, 100, 200, 200);
m_dockpanel->show();


Название: Re: Боковая панель
Отправлено: Larry от Март 01, 2016, 17:29
Теперь заработало...фон забыл добавить :)


Название: Re: Боковая панель
Отправлено: Larry от Март 03, 2016, 10:17
Добрый день.
Доделал почти панель, но возникла проблема с анимацией. После запуска программы панель сворачивается/разворачивается нормально, но стоит только изменить размеры (растянуть мышкой), то тут же ломается...
Вот метод анимации:
Код:
void QDockPanel::slotChangeState(bool state)
{
    QPropertyAnimation* animation = new QPropertyAnimation(this, "geometry");

    QRect brect, erect;

    m_state = !state; // текущее состояние панели

    if(state)
    {
        if(m_stick == stick_t::LEFT_STICK) // левая панель
        {
            brect = QRect(0, 0, this->m_size.width(), this->m_size.height());
            erect = QRect(0, 0, m_header->button()->width(), this->m_size.height());
        }
        else if(m_stick == stick_t::RIGHT_STICK) // правая панель
        {
            brect = QRect(this->parentWidget()->geometry().width() - this->m_size.width(), 0, this->m_size.width(),
                          this->m_size.height());
            erect = QRect(this->parentWidget()->geometry().width() - m_header->button()->width(), 0, m_header->button()->width(),
                          this->m_size.height());
        }
    }
    else
    {
        if(m_stick == stick_t::LEFT_STICK) // левая панель
        {
            brect = QRect(0, 0, m_header->button()->width(), this->m_size.height());
            erect = QRect(0, 0, this->m_size.width(), this->m_size.height());
        }
        else if(m_stick == stick_t::RIGHT_STICK) // правая панель
        {
            brect = QRect(this->parentWidget()->geometry().width() - m_header->button()->width(), 0, m_header->button()->width(),
                          this->m_size.height());
            erect = QRect(this->parentWidget()->geometry().width() - this->m_size.width(), 0, this->m_size.width(),
                                                                                              this->m_size.height());
        }
    }

    animation->setDuration(m_duration);
    animation->setStartValue(brect);
    animation->setEndValue(erect);

    connect(animation, SIGNAL(finished()), this, SLOT(slotFinishedChangeState()));

    animation->start();
}

хотя по логу вроде бы все нормально, размеры выводит адекватно...


Название: Re: Боковая панель
Отправлено: gil9red от Март 03, 2016, 10:25
Добрый день.
Доделал почти панель, но возникла проблема с анимацией. После запуска программы панель сворачивается/разворачивается нормально, но стоит только изменить размеры (растянуть мышкой), то тут же ломается...
Вот метод анимации:
Код:
void QDockPanel::slotChangeState(bool state)
{
    QPropertyAnimation* animation = new QPropertyAnimation(this, "geometry");

    QRect brect, erect;

    m_state = !state; // текущее состояние панели

    if(state)
    {
        if(m_stick == stick_t::LEFT_STICK) // левая панель
        {
            brect = QRect(0, 0, this->m_size.width(), this->m_size.height());
            erect = QRect(0, 0, m_header->button()->width(), this->m_size.height());
        }
        else if(m_stick == stick_t::RIGHT_STICK) // правая панель
        {
            brect = QRect(this->parentWidget()->geometry().width() - this->m_size.width(), 0, this->m_size.width(),
                          this->m_size.height());
            erect = QRect(this->parentWidget()->geometry().width() - m_header->button()->width(), 0, m_header->button()->width(),
                          this->m_size.height());
        }
    }
    else
    {
        if(m_stick == stick_t::LEFT_STICK) // левая панель
        {
            brect = QRect(0, 0, m_header->button()->width(), this->m_size.height());
            erect = QRect(0, 0, this->m_size.width(), this->m_size.height());
        }
        else if(m_stick == stick_t::RIGHT_STICK) // правая панель
        {
            brect = QRect(this->parentWidget()->geometry().width() - m_header->button()->width(), 0, m_header->button()->width(),
                          this->m_size.height());
            erect = QRect(this->parentWidget()->geometry().width() - this->m_size.width(), 0, this->m_size.width(),
                                                                                              this->m_size.height());
        }
    }

    animation->setDuration(m_duration);
    animation->setStartValue(brect);
    animation->setEndValue(erect);

    connect(animation, SIGNAL(finished()), this, SLOT(slotFinishedChangeState()));

    animation->start();
}

хотя по логу вроде бы все нормально, размеры выводит адекватно...

Локализуйте место ошибки и напишите проблемную строку, а если приложите минимальный проект, вообще будет замечательно


Название: Re: Боковая панель
Отправлено: Larry от Март 03, 2016, 10:38
Локализовать место ошибки не получается, т.к. вроде все нормально отрабатывается...Попробую сделать минимальный проект...
На изображении 1 и 2 это развернутая и свернутая панель до изменения размера, а на изображении 3 - это свернутая (так и не свернулась) после изменения размера.


Название: Re: Боковая панель
Отправлено: Larry от Март 03, 2016, 10:59
Минимальный проект вложил...


Название: Re: Боковая панель
Отправлено: Larry от Март 04, 2016, 09:59
Решил попробовать изменить размер программно и сделал по правому клику на панели изменение ширины...при этом все обрабатывается адекватно, а после растягивания мышкой панели ничего не работает...не могу понять почему...


Название: Re: Боковая панель
Отправлено: Larry от Март 04, 2016, 10:13
Решил проблему, все работает. Всем спасибо. Виновником оказался метод setFixedWidth, который вызывался при изменении размеров панели мышкой. Причем либо невнимательно читал мануал, либо там нет такого, что нельзя фиксировать размер - об этом прочитал в одном посте на зарубежном сайте.