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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: this->setWindowFlags(Qt::FramelessWindowHint); как потом растянуть выджет  (Прочитано 5379 раз)
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
Но  как то коряво получается.

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

В общем подскажите как такое провернуть?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 15, 2016, 17:18 »

В общем подскажите как такое провернуть?
Просто написать, аккуратно. За основу можно взять пример что Вы нашли, и довести его до ума. Напр вместо 4 булевских переменных лучше флажок, когда тянет за угол - должно растягиваться по обеим осям, проверять на minimum/maximumSize и.т.д.

[OFF]
Плохо что такая легкая и приятная задачка Вам в тягость (насколько я понял из поста и кода). Хотелось хапнуть готовенькое, тыц - и оно все сделало! Ну может мне так показалось  Улыбающийся
[/OFF]
Записан
shtrix
Гость
« Ответ #2 : Апрель 15, 2016, 18:08 »

Не ну конечно хотелось готовенькое хапнуть Смеющийся
Ну так из этого примера и пытаюсь но при растягивании виджета влево дергается правая сторона(при завершении растяжки она то на месте остается)как с этим быть?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 16, 2016, 09:11 »

Ну так из этого примера и пытаюсь но при растягивании виджета влево дергается правая сторона(при завершении растяжки она то на месте остается)как с этим быть?
Улучшать код и отлаживать. У меня все окна FrameLess и никто не дергается.
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #4 : Апрель 17, 2016, 09:43 »

При растягивании влево на L пикселей, координата X виджета уменьшается на L и ширина виджета увеличивается на L.
L - это разность между текущим положением мышки в mouseMoveEvent и предыдущим, которое Вы запомнили в mouseClickEvent или в предыдущем mouseMoveEvent.
Как правильно заметил Igors, смотрите вывод (qDebug()) ваших координат до движения виджета и после, а также дельты между текущей позицией мышки и предыдущей.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 17, 2016, 09:53 »

L - это разность между текущим положением мышки в mouseMoveEvent и предыдущим, которое Вы запомнили в mouseClickEvent или в предыдущем mouseMoveEvent.
Использовать предыдущую позицию мыши нехорошо, т.к. не все действия имеют эффект. Напр если окно уже уменьшено до минимального размера, то мышь может гулять далеко, но это ничего не изменит. Правильно всегда опираться на координаты/геометрию окна
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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