Russian Qt Forum
Ноябрь 26, 2024, 14:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виджет-карта и легенда  (Прочитано 4326 раз)
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« : Февраль 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
Есть ли выход? Или я вообще на тупиковом пути?

« Последнее редактирование: Февраль 22, 2014, 19:52 от Day » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 23, 2014, 04:51 »

Не вижу "стандартного" варианта удовлетворяющего всем 3 требованиям. С точки зрения постановки/дызайна - если "принадлежит карте", то чего тогда системный фрейм? (который наоборот, показывает что окно самостоятельное). Просто виджет, вверху QLabel (под title), внизу QSizeGrip
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #2 : Февраль 23, 2014, 09:31 »

Igors, Спасибо за ответ. Т.е. сделать "легенду" полноценным окном (Qt::Window) не получится (да и не надо). Делаем ее QFrame, располагаем на ней чего надо, в том числе самодельную кнопочку "Close".
Как сделать перемещение? Drag-Drop-техникой, да? Я просто ей еще не пользовался, но тем интереснее будет попробовать.
Изменение размеров - это в общем-то от лукавого - обойдусь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 23, 2014, 09:43 »

В аттаче заготовка для окна, для виджета добавьте отсечку по родителю
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #4 : Февраль 23, 2014, 09:53 »

Igors, Спасибо! буду разбираться.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #5 : Февраль 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 не попадаю никак
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #6 : Февраль 24, 2014, 15:56 »

Решил поиграть с базовыми классами. Произвел Легенду от QLabel. События мыши стал воспринимать. Хоть и криво. Но расположить на нем то, что нужно, не получилось. Получился маленький пустой квадратик. Немного удивило. Ведь Лабел - тоже виждет. И, по идее, должен воспринимать setLayout. (Наполнение Легенды делаю руками, без Designer). Ну это - ладно. Не в тему. Потом.
Потом произвел ее от QDialog. Стала вести себя совершенно самостоятельно.  Вылезает за Карту. Перетаскивается за  title. За тело (как было задумано) - не хочет. mousePressEvent не воспринимает.
Есть идея, события мыши отлавливать не от Легенды, а от Карты. Эксперименты продолжаются.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #7 : Февраль 24, 2014, 17:20 »

Что выяснилось. Во-первых пара ошибок. В mousePressEvent надо писать не if (pe->button()==Qt:LeftButton), а if (pe->button() & Qt:LeftButton)
А в mouseMoveEvent вообще не надо if (pe->button() & Qt:LeftButton). Моя вина здесь не велика, переписал из Шлее.
Во-вторых, если события мыши привязать не к Легенде, а к Карте, то если я делаю все манипуляции вне Легенды, все чудесно перемещается. На Легенде же (производная от QFrame) mousePressEvent не возникает. Она как бы защищает Карту своим телом от мышиной возни.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #8 : Февраль 24, 2014, 21:37 »

Вот уже "дошел" до того, что использую installEventFilter для своей м-а-аленькой Легенды. Входит, однако. И тут же выходит. Прямо как у ослика Иа. И ничего не выходит! Наверное, что-то делаю очень не так. Но глаз, видать, весь в мыле. До завтра!
Оно, конечно, можно и по другому решить. Но я ее уже полюбил. Даже сделал походя прозрачной. Очень женственно вышло. И опыт, конечно, опыт! Отрицательный результат - тоже результат! Улыбающийся
Но этот пост, полный отчаянья и смирения, поднял меня в великой иерархии до САМОВАРА. Звание это с удовольствием принимаю, и даже немножко горжусь Улыбающийся
« Последнее редактирование: Февраль 24, 2014, 21:41 от Day » Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #9 : Февраль 25, 2014, 13:57 »

Все оказалось очень просто (как всегда) Смеющийся
На виджет-легенду были помещены другие виджеты (Qlabel). И события мыши воспринимали именно они. А Легенде ничего не доставалось.
День потерян был не зря Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.285 секунд. Запросов: 22.