Как “примагнитить” одно окно к другому в qt?

180
10 марта 2019, 04:00

Хочу сделать, чтобы при приближении одного окна к другому, оно "примагничивалось" к нему и в дальнейшем, чтобы перемещение основного окна влекло за собой перемещение примагниченного, а при попытке перемещения побочного окна, оно "отмагничивалось".
Пока что моя идея сводится к тому, что нужно найти сигнал перемещения каждого из окон, и в обработке сигнала основного окна менять координаты побочного, а в обработке сигнала побочного при попытке "оторвать" его, удерживать его на месте, пока его не отведут достаточно далеко.
Сложность в том, что я не нашел сигналов перемещения окна (только сигнал перемещения виджета внутри родительского объекта, что не подходит) и "удержание" побочного окна, при попытке его убрать, кажется, будет выглядеть дерганным.

Пример того, как я это вижу:

void GraphicWindow::holdWindow()
{
    int x1,x2,y1,y2;
    mw_ptr->geometry().getCoords(&x1,&y1,&x2,&y2);
    if(abs(this->geometry().x() - x1 -x2)+abs(this->geometry().y() - y1) > 10)
    {
        sticky_flag = false;
    }
    else
    {
        if(!sticky_flag)
        {
            sticky_flag = true;
        }
        this->setGeometry(x2+1,y1,this->geometry().width(),this->geometry().height());
    }
}
void GraphicWindow::moveWindow()
{
    if(sticky_flag)
    {
        int x1,x2,y1,y2;
        mw_ptr->geometry().getCoords(&x1,&y1,&x2,&y2);
        this->setGeometry(x2+1,y1,this->geometry().width(),this->geometry().height());
    }
}

Это 2 слота, первый подключается к сигналу движения окна, которое приклеивается, второй подключается к сигналу движения окна, к которому приклеиваемся, окна независимы друг от друга, но у в приклеиваемом окне есть указатель на приклеиваемое окно.

READ ALSO
Реализация кучи

Реализация кучи

Говорят, что динамическая память в программе выделяется в куче, а локальные переменные - в стекеЕсли с реализаций стека всё вроде бы понятно,...

195
Студия 2017, cmake и boost на remote машине

Студия 2017, cmake и boost на remote машине

Использую студию 2017 и 2 варианта ремоут машин (WSL и VirtualBox(Debian95))

129
Необычная функция main

Необычная функция main

Недавно увидел в программе следующую версию main функции:

172
Зачем нужны две эквивалентные записи char** и char*[]?

Зачем нужны две эквивалентные записи char** и char*[]?

Судя по этому ответу, записи char** и char*[] в параметрах функции означают один и тот же типЗачем так сделано и в каких ситуациях они будут означать...

191