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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Окно без системной рамки, проблема с отрисовкой при перемещении.  (Прочитано 13978 раз)
NikolasRA
Гость
« : Август 17, 2013, 13:51 »

Добрый день. Проблема у меня следующая: есть прямоугольное окно без системной рамки(так мне поставили условие в университете), то есть все кнопки закрытия и сворачивания сделанны вручную, также с помощью событий нажатия и перемещения мыши было реализованно перемещение окна, однако с этим проблемы, при перемещении окно не успевает перемещаться за мышью, кроме того, остаётся след от предыдущего местоположения элементов, то есть они немного размазываются, проблема, я думаю, с отрисовкой всей формы. Вопрос: как реализовыть эту прорисовку, либо отключить системную и вызывать свою? При этом содержимое должно отображаться.
Извиняюсь за возможный повтор темы, сам искал, но ничего, к сожалению, по конкретно моей проблеме не нашёл(ткните если уже таковая была), по этому обратился к вам.
Единственное в документации сказано про двойную буферизацию, но что делать когда каждый элемент, в том числе и те, которые создаются динамически требуют корректирования?
Версия QT 5.1.0. Рисуется всё на QMainWindow. В Qt недавно, прошу прощения, если вопрос групый.
Записан
RomiX
Гость
« Ответ #1 : Август 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);
« Последнее редактирование: Август 17, 2013, 14:25 от RomiX » Записан
RomiX
Гость
« Ответ #2 : Август 17, 2013, 14:35 »

Только если двигать окно, надо будет прибавить смещение к координатам, иначе оно сначала "прыгает" на десяток пикселей, а потом нормально перемещается...
Записан
NikolasRA
Гость
« Ответ #3 : Август 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;
    }
}
условия для премещения исходя из обсласти перемещения(она у меня меньше чем во всю ширину)
Кстати со следами фильтр событий проблему не решил( видимо вся фишка в отсутствии системной рамки, ибо остальное я не менял, ну разве что наложение маски на форму.
« Последнее редактирование: Август 17, 2013, 14:43 от NikolasRA » Записан
RomiX
Гость
« Ответ #4 : Август 17, 2013, 14:43 »

Да вроде всё ок. Странно, у меня без рамки тоже всё отлично, двигаю QLabel так
Записан
NikolasRA
Гость
« Ответ #5 : Август 17, 2013, 14:45 »

А если с маской?
Типо так
Код:
QRect rect(0,0,685,450);
    this->setMask(rect);
Записан
RomiX
Гость
« Ответ #6 : Август 17, 2013, 14:47 »

Тоже ок, просто обрезается по прямоугольнику...
По эллипсу тоже работет
« Последнее редактирование: Август 17, 2013, 14:49 от RomiX » Записан
NikolasRA
Гость
« Ответ #7 : Август 17, 2013, 14:48 »

Хм, странно, он всё равно соскакивает из под мыши, даже если ограничения на область убрать...
Записан
RomiX
Гость
« Ответ #8 : Август 17, 2013, 14:52 »

Чтобы не скакало, там надо подобрать смещение для координат... Это если с рамкой, без рамки у меня нормально
А вот изменение размера прыгает, наверное надо сделать resize окна один раз вручную, перед показом окна, и переместить кнопки в нужную позицию в моём случае
« Последнее редактирование: Август 17, 2013, 14:53 от RomiX » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 17, 2013, 14:59 »

В аттаче пример, там правда есть ошибка, но уже не помню какая. Впрочем это даже хорошо, разберетесь, не все списывать  Улыбающийся
Записан
NikolasRA
Гость
« Ответ #10 : Август 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);
там фон накладывается, но это не важно
Записан
NikolasRA
Гость
« Ответ #11 : Август 17, 2013, 15:05 »

RomiX, кстати про прыжки, я так понимаю, что относительное перемещение мыши нужно добавлять к её положению в move?
Igors, сейчас посмотрю, спасибо)
Записан
RomiX
Гость
« Ответ #12 : Август 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();
Записан
RomiX
Гость
« Ответ #13 : Август 17, 2013, 15:09 »

Вот целиком
Записан
NikolasRA
Гость
« Ответ #14 : Август 17, 2013, 15:10 »

Странно, у меня не прыгает, с одной стороны хорошо, с другой не пойму тогда, в чём проблема(
Если медленно двигать, то всё нормально.. если чуть быстрее- то всё печально..
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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