Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Kirill_m от Сентября 27, 2012, 14:17



Название: Перетаскивание виджета в программе
Отправлено: Kirill_m от Сентября 27, 2012, 14:17
Как можно сделать и можно ли сделать, так чтобы можно было передвигать виджеты в программе.
То-есть зажал на виджете левой кн. мыши и перетащил в другое место. ???


Название: Re: Перетаскивание виджета в программе
Отправлено: Пантер от Сентября 27, 2012, 14:21
http://qt-project.org/doc/qt-4.8/qmouseevent.html


Название: Re: Перетаскивание виджета в программе
Отправлено: Kirill_m от Сентября 27, 2012, 14:42
Спасибо буду изучать.


Название: Re: Перетаскивание виджета в программе
Отправлено: Пантер от Сентября 27, 2012, 14:44
Если быть точнее, тебе нужно:
http://qt-project.org/doc/qt-4.8/qwidget.html#mousePressEvent
http://qt-project.org/doc/qt-4.8/qwidget.html#mouseMoveEvent
http://qt-project.org/doc/qt-4.8/qwidget.html#mouseReleaseEvent


Название: Re: Перетаскивание виджета в программе
Отправлено: Пантер от Сентября 27, 2012, 14:45
Ну, и, конечно, поиск по форуму рулит. ;)


Название: Re: Перетаскивание виджета в программе
Отправлено: Kirill_m от Октября 06, 2012, 12:20
Сделал вот так:
Код:
void Sensor::mousePressEvent(QMouseEvent *event)
{
    QRect p = this->geometry();
    if(event->button() == Qt::LeftButton)
    {
        lastPoint = event->pos();
        b_move = true;
    }
}

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

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

Все хорошо, НО когда зажимаешь виджет он смещается, сильно где то в середину окна.


Название: Re: Перетаскивание виджета в программе
Отправлено: Bepec от Октября 06, 2012, 12:29
Координаты бывают глобальные(абсолютные), относительно  виджета (то, что ты в евентах получаешь).

Так что используй ф-ции mapToGlobal();


Название: Re: Перетаскивание виджета в программе
Отправлено: Kirill_m от Октября 06, 2012, 13:00
Координаты бывают глобальные(абсолютные), относительно  виджета (то, что ты в евентах получаешь).

Так что используй ф-ции mapToGlobal();
А можно поточнее где именно использовать?
Код:
void Sensor::mousePressEvent(QMouseEvent *event)
{
    QRect p = this->geometry();
    if(event->button() == Qt::LeftButton)
    {
        lastPoint = mapToGlobal(event->pos());
        b_move = true;
    }
}
Сбрасывает расположение в 0,0