Russian Qt Forum

Qt => Вопросы новичков => Тема начата: shtrix от Апрель 15, 2016, 16:40



Название: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: shtrix от Апрель 15, 2016, 16:40
На форме widget на нем  кнопочки слайдеры и.т.д   
Код:
 /// Скрываем элементы управления и рамку окна...
    this->setWindowFlags(Qt::FramelessWindowHint);
 /// Включаем прозрачность главной формы...
    setAttribute(Qt::WA_TranslucentBackground );
А как теперь сделать что бы как на форме(которую я скрыл) работало(то есть потянул за правый край виджет увеличился  в право,за левый в лева и.т.д) ?
Я так понимаю растягивать все равно нужно скрытую (главную форму ).

Пытался делать так для левой стороны  виджета
Код:
//в playerwindow.h
bool m_Border ;
//playerwindow.cpp
bool playerwindow::eventFilter(QObject *o, QEvent *e)
{

    bool isLeftBorder=false;
    this->setMouseTracking(true);
    ui->widget_2->setMouseTracking(true);

    QMouseEvent* mEvent = static_cast<QMouseEvent*>(e);

    if(mEvent->pos().x()<=3&&mEvent->pos().x()>0)
    {
        isLeftBorder=true;
    }

    switch(e->type())
    {
    case QEvent::MouseButtonPress:
        {
            if(isLeftBorder)
            {
                m_Border = true;
                return true;
            }
        }
        break;

    case QEvent::MouseButtonRelease:
        {
            m_Border=false;
            break;
        }
    case QEvent::MouseMove:
        {

            if( isLeftBorder)
                this->setCursor(Qt::SizeHorCursor);
            else
                this->setCursor(Qt::ArrowCursor);


            QRect wgtGeometry = this->geometry();

            if(m_Border )
            {
                QPoint newPosition = this->mapToParent(mEvent->pos());
                QPoint oldBottomRight = wgtGeometry.bottomRight();
                wgtGeometry.setX(newPosition.x());
                wgtGeometry.setBottomRight(oldBottomRight);
                if(wgtGeometry.width()<this->minimumSize().width())
                {
                    wgtGeometry.setWidth(this->minimumSize().width());
                    return QObject::eventFilter(this, e);
                }
            }
            this->setGeometry(wgtGeometry);
        }
    }

    return QObject::eventFilter(this, e);
}


Тут подсмотрел http://www.cyberforum.ru/qt/thread1200536.html (http://www.cyberforum.ru/qt/thread1200536.html)
Но  как то коряво получается.

При раздвигании в лево правая часть дергается ,бывает видно черный фон(как будто не успевает перерисовать окно).

В общем подскажите как такое провернуть?


Название: Re: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: Igors от Апрель 15, 2016, 17:18
В общем подскажите как такое провернуть?
Просто написать, аккуратно. За основу можно взять пример что Вы нашли, и довести его до ума. Напр вместо 4 булевских переменных лучше флажок, когда тянет за угол - должно растягиваться по обеим осям, проверять на minimum/maximumSize и.т.д.

[OFF]
Плохо что такая легкая и приятная задачка Вам в тягость (насколько я понял из поста и кода). Хотелось хапнуть готовенькое, тыц - и оно все сделало! Ну может мне так показалось  :)
[/OFF]


Название: Re: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: shtrix от Апрель 15, 2016, 18:08
Не ну конечно хотелось готовенькое хапнуть ;D
Ну так из этого примера и пытаюсь но при растягивании виджета влево дергается правая сторона(при завершении растяжки она то на месте остается)как с этим быть?


Название: Re: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: Igors от Апрель 16, 2016, 09:11
Ну так из этого примера и пытаюсь но при растягивании виджета влево дергается правая сторона(при завершении растяжки она то на месте остается)как с этим быть?
Улучшать код и отлаживать. У меня все окна FrameLess и никто не дергается.


Название: Re: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: torwig от Апрель 17, 2016, 09:43
При растягивании влево на L пикселей, координата X виджета уменьшается на L и ширина виджета увеличивается на L.
L - это разность между текущим положением мышки в mouseMoveEvent и предыдущим, которое Вы запомнили в mouseClickEvent или в предыдущем mouseMoveEvent.
Как правильно заметил Igors, смотрите вывод (qDebug()) ваших координат до движения виджета и после, а также дельты между текущей позицией мышки и предыдущей.


Название: Re: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет
Отправлено: Igors от Апрель 17, 2016, 09:53
L - это разность между текущим положением мышки в mouseMoveEvent и предыдущим, которое Вы запомнили в mouseClickEvent или в предыдущем mouseMoveEvent.
Использовать предыдущую позицию мыши нехорошо, т.к. не все действия имеют эффект. Напр если окно уже уменьшено до минимального размера, то мышь может гулять далеко, но это ничего не изменит. Правильно всегда опираться на координаты/геометрию окна