crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Trisch
  опции профиля:
сообщение 3.5.2012, 7:08
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Я вот написал "окно верхнего уровня". И теперь мне надо заставить его перемещаться по экрану.

я сделал это так
void SetStyle::mousePressEvent(QMouseEvent *event)
{
    if (event->button() & Qt::LeftButton) {
        x1 = event->pos().x();
        y1 = event->pos().y();
        std::cout << x1 << " ";
    }

}

void SetStyle::mouseMoveEvent(QMouseEvent *event)
{
    double dx;
    double dy;

    ox = geometry().x();
    oy = geometry().y();

    x2 = event->pos().x();
    y2 = event->pos().y();

    if ((x1 != x2) || (y1 != y2)) {
        dx = x2 - x1;
        dy = y2 - y1;
        move((ox + dx), (oy + dy));
    }
    x1 = x2;
    y1 = y2;
}


но оно передвигается рывками и курсор мыши меняет свое положение относительно этого окна. как это можно исправить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 3)
Алексей1153
  опции профиля:
сообщение 3.5.2012, 7:23
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Trisch, нужно запоминать относительные для окна координаты курсора (E) - расстояние от угла окна до курсора , а также размер окна (это удобно при последующих манипуляциях)

когда перемещается курсор (текущая точка - A1), окно должно быть показано в точке = A1-E
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 4.5.2012, 9:18
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


я вот немного отредактировал код
void SetStyle::mousePressEvent(QMouseEvent *event)
{
    if (event->button() & Qt::LeftButton) {
        x1 = event->pos().x();
        y1 = event->pos().y();
    }

}

void SetStyle::mouseMoveEvent(QMouseEvent *event)
{
    double dx;
    double dy;

    ox = geometry().x();
    oy = geometry().y();

    x2 = event->x();
    y2 = event->y();

    if ((x1 != x2) || (y1 != y2)) {
        dx = x2 - x1;
        dy = y2 - y1;
        move((ox + dx), (oy + dy));
    }
}


но движения так же остались скачкообразными. Но при этом под ОС Windows все работает нормально. Проблемы только в Linux(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 5.5.2012, 11:58
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вот как-то так. Не компилировал
...
//член класса окна QMyWidget
QPoint m_pE;
...


void QMyWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() & Qt::LeftButton)
    {
        //относительные координаты
        m_pE=event->pos();
    }

}

void QMyWidget::mouseMoveEvent(QMouseEvent *event)
{
    //глобальные координаты курсора
    QPoint pG=event->globalPos();

    //глобальное новое положение окна
    QPoint pNewPos=pG-m_pE;

    //если есть родитель, спроецировать на него
    //если, конечно, окно не "свободное"
    if(parent())
    {
        pNewPos=parent()->mapFromGlobal(pNewPos);
    }
    
    move(pNewPos);
}


Сообщение отредактировал Алексей1153 - 8.5.2012, 6:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 15:18