Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: NikolasRA от Август 17, 2013, 13:51



Название: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 13:51
Добрый день. Проблема у меня следующая: есть прямоугольное окно без системной рамки(так мне поставили условие в университете), то есть все кнопки закрытия и сворачивания сделанны вручную, также с помощью событий нажатия и перемещения мыши было реализованно перемещение окна, однако с этим проблемы, при перемещении окно не успевает перемещаться за мышью, кроме того, остаётся след от предыдущего местоположения элементов, то есть они немного размазываются, проблема, я думаю, с отрисовкой всей формы. Вопрос: как реализовыть эту прорисовку, либо отключить системную и вызывать свою? При этом содержимое должно отображаться.
Извиняюсь за возможный повтор темы, сам искал, но ничего, к сожалению, по конкретно моей проблеме не нашёл(ткните если уже таковая была), по этому обратился к вам.
Единственное в документации сказано про двойную буферизацию, но что делать когда каждый элемент, в том числе и те, которые создаются динамически требуют корректирования?
Версия QT 5.1.0. Рисуется всё на QMainWindow. В Qt недавно, прошу прощения, если вопрос групый.


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 14:06
Я делал перемещение и изменение размера виджета при нажатии на QToolButton с иконкой. Просто ловим событие перемещение мыши и изменяем размер либо позицию, у меня проблем с перерисовкой не было, двигается как обычное окно, так и отдельный виджет
Код:
bool GridWidget::eventFilter(QObject *object, QEvent *e)
{
    if (object == m_moveButton) {
        if (e->type() == QEvent::MouseMove) {
            QMouseEvent *me = static_cast<QMouseEvent *>(e);
            move(mapToParent(me->pos() - m_offset));
            return true;
        } else if (e->type() == QEvent::MouseButtonPress) {
            QMouseEvent *me = static_cast<QMouseEvent *>(e);
            m_offset = me->pos();
            return false;
        }
        return false;
    } else if (object == m_resizeButton) {
        if (e->type() == QEvent::MouseMove) {
            QMouseEvent *me = static_cast<QMouseEvent *>(e);
            QPoint sz = me->pos() - m_offset;
            sz += QPoint(size().width(), size().height());
            resize(sz.x(), sz.y());
            m_widget->resize(sz.x(), sz.y());
            m_resizeButton->move(sz.x() - m_resizeButton->width() - 5, sz.y() - m_resizeButton->height() -  5);
            return true;
        } else if (e->type() == QEvent::MouseButtonPress) {
            QMouseEvent *me = static_cast<QMouseEvent *>(e);
            m_offset = me->pos();
            return false;
        }
        return false;
    }
    return false;
}

С каждой кнопкой нужно сделать так:
Код:
m_resizeButton->installEventFilter(this);


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 14:35
Только если двигать окно, надо будет прибавить смещение к координатам, иначе оно сначала "прыгает" на десяток пикселей, а потом нормально перемещается...


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 14:38
То есть так не пойдёт?

Код:
void MainWindow::mousePressEvent(QMouseEvent * event)
{
   if (event->pos().x()<605&&event->pos().y()<35&&event->pos().x()>85)
    {
        if(event->button() == Qt::LeftButton)
        {
            Last_Point = event->pos();
            b_move = true;
        }
    }
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (event->pos().x()<605&&event->pos().y()<35&&event->pos().x()>85)
    {
    if((event->buttons() & Qt::LeftButton) && b_move)
        move(event->globalX()-Last_Point.x(),
             event->globalY()-Last_Point.y());
    }
  
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && b_move)
    {
            b_move = false;
    }
}
условия для премещения исходя из обсласти перемещения(она у меня меньше чем во всю ширину)
Кстати со следами фильтр событий проблему не решил( видимо вся фишка в отсутствии системной рамки, ибо остальное я не менял, ну разве что наложение маски на форму.


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 14:43
Да вроде всё ок. Странно, у меня без рамки тоже всё отлично, двигаю QLabel так


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 14:45
А если с маской?
Типо так
Код:
QRect rect(0,0,685,450);
    this->setMask(rect);


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 14:47
Тоже ок, просто обрезается по прямоугольнику...
По эллипсу тоже работет


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 14:48
Хм, странно, он всё равно соскакивает из под мыши, даже если ограничения на область убрать...


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 14:52
Чтобы не скакало, там надо подобрать смещение для координат... Это если с рамкой, без рамки у меня нормально
А вот изменение размера прыгает, наверное надо сделать resize окна один раз вручную, перед показом окна, и переместить кнопки в нужную позицию в моём случае


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: Igors от Август 17, 2013, 14:59
В аттаче пример, там правда есть ошибка, но уже не помню какая. Впрочем это даже хорошо, разберетесь, не все списывать  :)


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 15:01
Так, ну в общем вот код, в нём наверное проблема, ибо без него то есть при стандартном окне всё отлично)
Код:
setWindowFlags(Qt::FramelessWindowHint);
    ui->setupUi(this);
    ui->mainToolBar->setVisible(0);
    ui->statusBar->setVisible(0);
    ui->menuBar->setVisible(0);
    QPixmap pix(":/1.png");
    ui->label->setPixmap(pix);
    ui->label->setScaledContents(1);
    QRect rect(0,0,685,450);
    this->setMask(rect);
там фон накладывается, но это не важно


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 15:05
RomiX, кстати про прыжки, я так понимаю, что относительное перемещение мыши нужно добавлять к её положению в move?
Igors, сейчас посмотрю, спасибо)


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 15:07
Я честно говоря не сильно разбирался со всеми этими координатами, просто заметил что оно прыгает влево вверх, ну и прибавил смещение)

Я сделал чуть-чуть по другому, я создаю виджет поверх передвигаемого виджета...
Код:
QLabel l("asdasdasdasd");
l.setPixmap(QPixmap("C://a.jpg"));

GridWidget w;
w.setWidget(&l);

w.setWindowFlags(Qt::FramelessWindowHint);
w.setMask(QRegion(0, 0, 685, 450));

w.show();


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 15:09
Вот целиком


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 15:10
Странно, у меня не прыгает, с одной стороны хорошо, с другой не пойму тогда, в чём проблема(
Если медленно двигать, то всё нормально.. если чуть быстрее- то всё печально..


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 15:13
Можект какие проблемы с драйверами на видеокарту, я даже между двумя монитормаи дёргаю его очень быстро и всё нормально. А вот qml элементы у меня поддтормаживают, хотя они вроде как те же объекты C++, и перемещение тоже медленно...


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 15:15
Спрыгивает перемещение обычного окна с рамкой, видимо из-за размеров этой самой рамки, как раз прыгает на её толщину...


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 15:30
Romix, благодарю, у меня примерно такой же подход, просто я отделил каждое событие, а так у меня там LastPoint есть, вроде он как раз за смещение и отвечает, не было resize, добавил, не помогло((( Но всё равно спасибо)


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 15:31
На счёт обычной рамки вы правы, действительно, но пробовал на 3 компьютерах - тоже самое((


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: RomiX от Август 17, 2013, 15:42
Пожалуйста)
А может зависит от того, что в окне отрисовывается? Я пробовал большую картинку, текст, и видео (для этого и писал)...


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 16:41
Чтобы лучше было понятно, в чём проблема, вот скомпилированный файл,  интерфейс убогий, но всё-же это тестовая версия, собственно, если у вас всё правильно заработает, то тогда мне только с драйверами возиться)
В один архив не поместился...
Чтобы разархивировать 01 02 03 нужно разархивировать в одну папку, после этого в ту папку переместить 0 и разархивировать его, заморочки zip что при разделении другой формат(


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 16:42
вот 2 часть


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 16:43
вот 3


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 16:44
ну а вот основная часть, ещё раз прошу прощения за столь моторную передачу, файл слишком велик для передачи целиком(


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: NikolasRA от Август 17, 2013, 17:40
Igors, ещё раз благодарю, разобрался, там с областью что-то странное было, но убрал, переписал, заработало, как надо, есдинственное, как убрать следящие виджеты, а то смо следом как-то не очень приятно) ну наверное это двойной буферизацией решается..
Может, если кто сталкивался с подобным, отпишитесь, что вы делали?


Название: Re: Окно без системной рамки, проблема с отрисовкой при перемещении.
Отправлено: Igors от Август 17, 2013, 18:58
Igors, ещё раз благодарю, разобрался, там с областью что-то странное было, но убрал, переписал, заработало, как надо, есдинственное, как убрать следящие виджеты, а то смо следом как-то не очень приятно) ну наверное это двойной буферизацией решается..
Может, если кто сталкивался с подобным, отпишитесь, что вы делали?
??? Не знаю ни каких "следящих". Буферизация на моем ОС автоматычно, в общем не понял Вашу проблему