crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Перемещение окна за любую его часть
breeve
  опции профиля:
сообщение 17.5.2010, 9:35
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

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




Репутация:   1  


Сабж. Есть popup окно и нужно сделать чтобы его можно было двигать. Не могу найти..

Сообщение отредактировал breeve - 17.5.2010, 9:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 17.5.2010, 11:04
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

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




Репутация:   2  


Цитата(breeve @ 17.5.2010, 10:35) *
Сабж. Есть popup окно и нужно сделать чтобы его можно было двигать. Не могу найти..

Ну обрабатывать на QWidget::mousePressEvent(),, заканчивать на QWidget::mouseReleaseEvent(). Когда клавиша зажата, то обрабатывать событие QWidget::mouseMoveEvent()(двигать виджет настолько, насколько подвинут курсор), предварительно включив QWidget::setMouseTracking() у виджета.
Примерно так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2010, 12:21
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(kibsoft @ 17.5.2010, 15:04) *
предварительно включив QWidget::setMouseTracking()
если мыша двигается с нажатой кнопкой, то слежение включается автоматически.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 17.5.2010, 12:36
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

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




Репутация:   1  


Не понятно каким образом двигать?
Переопределяю mousePressEvent. Пишу, если нажата левая клавиша то.. А двигать то как? В ручную?
Каким обрабатывать событие QWidget::mouseMoveEvent()?

Сообщение отредактировал breeve - 17.5.2010, 12:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2010, 12:39
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(breeve @ 17.5.2010, 16:36) *
А двигать то как? В ручную?
ну почти. В обработчике нажатия ставь флажок "начали двигать", в обработчике отпускания снимай его. А в обработчике движения смотри. если флажок стоит, спрашивай у объекта события текущее смещение координаты и на это смещение двигай виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 17.5.2010, 12:47
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

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




Репутация:   1  


void Console::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        b_move = true;
    }
}
void Console::mouseMoveEvent(QMouseEvent *event)
{
    if((event->buttons() & Qt::LeftButton) && b_move)
        move(event->pos());
}
void Console::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && b_move) {
            b_move = false;
        }
}


Сообщение отредактировал breeve - 17.5.2010, 12:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2010, 12:52
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


чёт я с событием колеса перепутал, у этого нет дельты, её надо самому считать, т.е. при нажатии запоминать текущую, а при перемещении вычислять дельту.

П.С. в доке по mouseMoveEvent для перемещения виджетов настоятельно рекомендуют использовать QMouseEvent::globalPos вместо всех остальных вариантов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 17.5.2010, 13:14
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

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




Репутация:   1  


Вот если кому надо, рабочий вариант:
void Console::mousePressEvent(QMouseEvent *event)
{
    QRect p = this->geometry();
    if(event->button() == Qt::LeftButton)
    {
        lastPoint = event->pos();        
        if(!p.contains(lastPoint))
            return;
        b_move = true;
    }
}

void Console::mouseMoveEvent(QMouseEvent *event)
{
    if((event->buttons() & Qt::LeftButton) && b_move)
        move(event->globalX()-lastPoint.x(),
             event->globalY()-lastPoint.y());
}

void Console::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && b_move) {
            b_move = false;
        }
}


Остался один не понятный момент. Если у меня окно стоит с флагом Qt::Window. То все работает правильно. Если же я выставляю Qt::ToolTip или Qt::Popup, то если я хоть раз нажму на другое окно то я больше не смогу его сдвинуть. Не понятно почему.

Сообщение отредактировал breeve - 17.5.2010, 13:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2010, 16:50
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(breeve @ 17.5.2010, 17:14) *
Если же я выставляю Qt::ToolTip или Qt::Popup, то если я хоть раз нажму на другое окно то я больше не смогу его сдвинуть. Не понятно почему.
ну добавь в обработчики отладочные сообщения, и посмотри. Заходит ли программа в них или нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gxoptg
  опции профиля:
сообщение 14.12.2011, 20:38
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.8.2011
Пользователь №: 2817

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




Репутация:   0  


Цитата
if(!p.contains(lastPoint))
            return;

а зачем вообще этот фрагмент? без него всё нормально работает, и заодно исправляется это:
Цитата
Если же я выставляю Qt::ToolTip или Qt::Popup, то если я хоть раз нажму на другое окно то я больше не смогу его сдвинуть. Не понятно почему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 16.4.2024, 22:26