Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Day от Февраль 22, 2014, 19:49



Название: Виджет-карта и легенда
Отправлено: Day от Февраль 22, 2014, 19:49
Добрый день! Всех мужчин с наступающим!
Есть виджет(назовем его Картой) (в самом деле MDI-субокно). На нем картинка. Хотелось бы создать дополнительный виджет - "легенду", на котором бы пояснялось, что происходит на Карте. Требования к виджету-легенде
1. Его можно двигать в пределах виджета-Карты и изменять его размер(т.е. у него есть заголовок и рамка) и закрывать
2. При перекрытии другой Картой, он должен тоже перекрываться
3. При движении Карты Легенда должна перемещаться вместе с ним.
Т.е. надо, чтоб Легенда была относительно самостоятельна, Но Карта была ее контейнером.
И вот никак не получается удовлетворить всем трем требованиям
Вот так я его создаю
Код:
   Leg = new QWidget(this, Qt::Window);  // (а) 
        // Попытка дать флаг Qt::SubWindow тоже ничего не дала
или
   Leg = new QWidget(this);              // (б)
   Leg->setParent(this);  // Это кажется, вообще ни на что не влияет
     // this - это Карта
В случае (а) выполняется требование 1 (однако вылезает за пределы), но не выполняются 2 и 3
В случае (б) выполняются требование 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). И события мыши воспринимали именно они. А Легенде ничего не доставалось.
День потерян был не зря :)