![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Obey-Kun |
![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Есть mainwindow. Там тулбары с экшнами, менюшки, указатель на мой QGraphicsView.
В моём унаследованном от QGraphicsView виджете есть Tool *m_tool. Tool — абстрактный класс инструмента (всякие выделения, создание наборов итемов в сцене и т. п). Во вью также есть enum'ный флаг выбранного инструмента. В зависимости от выбранного флага при нажатии ЛКМ создаётся соответственный инструмент. Так вот. Как идеологически верно менять значения флага выбранного инструмента во вью? Пока видится так: QToolBar'ы по дефолту испускают сигнал actionTriggered ( QAction * action ). В мейнвиндове я создам слот, который принимал бы этот сигнал и испускал в зависимости от нажатого экшна что-то типа signalChangeToolType(const MyView::ToolTypeEnum& type). Ну а этот сигнал принимался бы слотом во вью slotSetToolType(const ToolTypeEnum& type), что меняло бы флаг. Это правильно? И кстати, выбор инструмента вообще обычно делают в турбаре или где? P:S: делаю что-то похожее на Cad. |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Obey-Kun |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
фублин.
посмотрел на то, как панель с инструментами и палитра сделана в KDE'шном KolourPaint — и правда обычный QToolBar ![]() ![]() И насчёт сигналов. А можно в мейнвиндове сделать вот так?
То есть чтобы сигнал triggered() запускал слот с конкретным параметром. (m_pick_rectangle_selection -- указатель на QAction, а m_view -- указатель на мой объект-отображние) |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Obey-Kun |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Речь шла об этом?
Странно, даже enum не даёт использовать. где почитать про то, о чём вы упомянули (регистрация типа в системе метаинформаци Qt)? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
вообще-то ошибки компиляции быть не должно, просто соединение может не установиться.
Покажи полностью объявление класса, в котором объявлен слот pickInstrument вообще существуем много всяких примочек в Qt, чтобы зарегестрировать свои типы данных: Q_ENUMS Q_DECLARE_METATYPE qRegisterMetaType() ... |
|
|
Obey-Kun |
![]()
Сообщение
#7
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
я балбес, декларэйшн не написал
теперь заработало и я не свой объект передаю, а енумную фигню спасибо Кстати, правлильная ошибка из-за отсутствия соответствующих макросов выглядит примерно так:
![]() добавил Q_ENUMS(QFrost::ToolType) после макроса Q_OBJECT в хедерах классов, где енум надо использовать в системе сигналов-слотов, но это не помогло... как надо-то? ![]() странно... смотрите, сейчас сделано так:
И ругается
Если заставить этот connect выполняться попозже, то всё ок, коннект проходит и всё работает. Есть идеи? Сообщение отредактировал Obey-Kun - 3.4.2010, 3:08 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
QObject::connect: Cannot connect (null)::signalToolC... проблему выделил жирным. Т.е. неизвестно какому классу принадлежит функцияconnect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего.SLOT(slotSetTool(QFrost::ToolType))); Поэтому такое соединение нужно делать в родительском объекте. |
|
|
Obey-Kun |
![]()
Сообщение
#9
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Экспериментировал. В MainWindow было:
Ясен пень, что connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), SLOT(slotSetTool(QFrost::ToolType))); в конструкторе Area как надо не работало, ведь создавалось оно без родительского виджета, а потом уже он назначался. Исправил на:
Разумеется, всё заработало. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
мало того объявления родительского сигнала в дочернем объекте не видно, обычно. Наверное это и есть причина ошибки. Дело в том, что компилятор не контролирует соединение
|
|
|
Obey-Kun |
![]()
Сообщение
#11
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Цитата вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего. Поэтому такое соединение нужно делать в родительском объекте. Вот-вот ![]() но с другой стороны, тогда слот придётся делать публичным... так точно обычно делают? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Obey-Kun |
![]()
Сообщение
#13
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Цитата ну слот - функция, просто в отличие от функции-члена класса с ним можно связать сигнал. Да я знаю. Просто по-хорошему в моём случае слот можно сделать приватным и коннектить к нему сигнал пэрента в конструкторе. Это ради нормальной инкапсуляции и всё такое. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта.
Инкапсуляция похоронена заживо. А самое главное - похоронена концепция компонентного подхода (предоставляемая сигналами и слотами), т.к. компонент стал жёстко зависеть от конкретного includ'а можно конечно отказатся от объявления в сигнале и слоте перечисления и использовать int, но тогда контроль области определения функции (диаппазона изменения int'а) будешь делать своими глазами |
|
|
Obey-Kun |
![]()
Сообщение
#15
|
![]() Студент ![]() Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Цитата при таком подходе тебе нужно будет сделать видимым объявление перечисления внутри класса дочернего объекта. Так ведь в любом случае надо делать объявление перечисления видимым как минимум в MainWindow (он испускает сигнал) и во Вью (там слот). У меня enum объявлен в файле с константнами, типа того: Раскрывающийся текст
Ну а файл с константами подключается там, где надо. Так что не страшно. Кстати, всё почему-то заработало без ковыряния с Q_ENUMS. Сообщение отредактировал Obey-Kun - 3.4.2010, 4:12 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 24.6.2025, 0:30 |