Название: Виджет-карта и легенда Отправлено: Day от Февраль 22, 2014, 19:49 Добрый день! Всех мужчин с наступающим!
Есть виджет(назовем его Картой) (в самом деле MDI-субокно). На нем картинка. Хотелось бы создать дополнительный виджет - "легенду", на котором бы пояснялось, что происходит на Карте. Требования к виджету-легенде 1. Его можно двигать в пределах виджета-Карты и изменять его размер(т.е. у него есть заголовок и рамка) и закрывать 2. При перекрытии другой Картой, он должен тоже перекрываться 3. При движении Карты Легенда должна перемещаться вместе с ним. Т.е. надо, чтоб Легенда была относительно самостоятельна, Но Карта была ее контейнером. И вот никак не получается удовлетворить всем трем требованиям Вот так я его создаю Код: Leg = new QWidget(this, Qt::Window); // (а) В случае (б) выполняются требование 2 и 3, но не выполняется 1 Есть ли выход? Или я вообще на тупиковом пути? Название: Re: Виджет-карта и легенда Отправлено: Igors от Февраль 23, 2014, 04:51 Не вижу "стандартного" варианта удовлетворяющего всем 3 требованиям. С точки зрения постановки/дызайна - если "принадлежит карте", то чего тогда системный фрейм? (который наоборот, показывает что окно самостоятельное). Просто виджет, вверху QLabel (под title), внизу QSizeGrip
Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 23, 2014, 09:31 Igors, Спасибо за ответ. Т.е. сделать "легенду" полноценным окном (Qt::Window) не получится (да и не надо). Делаем ее QFrame, располагаем на ней чего надо, в том числе самодельную кнопочку "Close".
Как сделать перемещение? Drag-Drop-техникой, да? Я просто ей еще не пользовался, но тем интереснее будет попробовать. Изменение размеров - это в общем-то от лукавого - обойдусь. Название: Re: Виджет-карта и легенда Отправлено: Igors от Февраль 23, 2014, 09:43 В аттаче заготовка для окна, для виджета добавьте отсечку по родителю
Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 23, 2014, 09:53 Igors, Спасибо! буду разбираться.
Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 24, 2014, 13:51 Сделал так. Произвел свою Легенду от QFrame. Кинул туда кнопку закрытия (работает) и пару QLabel. Переопределил
virtual void mousePressEvent(QMouseEvent *pe); virtual void mouseMoveEvent(QMouseEvent *pe); virtual void mouseReleaseEvent(QMouseEvent *pe); В них как-будто делаю все, что нужно (для перемещения Легенды внутри Карты). Но беда в том, что входа в эти методы не происходит (поставил протоколирование входа в каждый метод) Не помогли также setMouseTracking(true), setEnabled(true), setFocus() Правда, после setMouseTracking(true) фиксируются входы в mouseMoveEvent, а в mousePressEvent не попадаю никак Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 24, 2014, 15:56 Решил поиграть с базовыми классами. Произвел Легенду от QLabel. События мыши стал воспринимать. Хоть и криво. Но расположить на нем то, что нужно, не получилось. Получился маленький пустой квадратик. Немного удивило. Ведь Лабел - тоже виждет. И, по идее, должен воспринимать setLayout. (Наполнение Легенды делаю руками, без Designer). Ну это - ладно. Не в тему. Потом.
Потом произвел ее от QDialog. Стала вести себя совершенно самостоятельно. Вылезает за Карту. Перетаскивается за title. За тело (как было задумано) - не хочет. mousePressEvent не воспринимает. Есть идея, события мыши отлавливать не от Легенды, а от Карты. Эксперименты продолжаются. Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 24, 2014, 17:20 Что выяснилось. Во-первых пара ошибок. В mousePressEvent надо писать не if (pe->button()==Qt:LeftButton), а if (pe->button() & Qt:LeftButton)
А в mouseMoveEvent вообще не надо if (pe->button() & Qt:LeftButton). Моя вина здесь не велика, переписал из Шлее. Во-вторых, если события мыши привязать не к Легенде, а к Карте, то если я делаю все манипуляции вне Легенды, все чудесно перемещается. На Легенде же (производная от QFrame) mousePressEvent не возникает. Она как бы защищает Карту своим телом от мышиной возни. Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 24, 2014, 21:37 Вот уже "дошел" до того, что использую installEventFilter для своей м-а-аленькой Легенды. Входит, однако. И тут же выходит. Прямо как у ослика Иа. И ничего не выходит! Наверное, что-то делаю очень не так. Но глаз, видать, весь в мыле. До завтра!
Оно, конечно, можно и по другому решить. Но я ее уже полюбил. Даже сделал походя прозрачной. Очень женственно вышло. И опыт, конечно, опыт! Отрицательный результат - тоже результат! :) Но этот пост, полный отчаянья и смирения, поднял меня в великой иерархии до САМОВАРА. Звание это с удовольствием принимаю, и даже немножко горжусь :) Название: Re: Виджет-карта и легенда Отправлено: Day от Февраль 25, 2014, 13:57 Все оказалось очень просто (как всегда) ;D
На виджет-легенду были помещены другие виджеты (Qlabel). И события мыши воспринимали именно они. А Легенде ничего не доставалось. День потерян был не зря :) |