crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Идеологически верный выбор инструментов.
Obey-Kun
  опции профиля:
сообщение 2.4.2010, 2:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Есть 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.4.2010, 4:06
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Obey-Kun @ 2.4.2010, 6:29) *
И кстати, выбор инструмента вообще обычно делают в турбаре или где?
Ну, QToolBar - панель инструментов, т.е. место, где размещаются инструменты.

Называй вещи своими именами, а не транслитом и всё станет понятно ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 2.4.2010, 17:56
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


фублин.
посмотрел на то, как панель с инструментами и палитра сделана в KDE'шном KolourPaint — и правда обычный QToolBar :). А раньше думал, что тулбары это только мелкие кнопочки сверху под менюбаром :).
И насчёт сигналов. А можно в мейнвиндове сделать вот так?
connect( m_pick_rectangle_selection, SIGNAL(triggered()), m_view, SLOT(pickInstrument( MyView::rectangle_selection )));

То есть чтобы сигнал triggered() запускал слот с конкретным параметром.
(m_pick_rectangle_selection -- указатель на QAction, а m_view -- указатель на мой объект-отображние)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 1:31
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Obey-Kun @ 2.4.2010, 21:56) *
То есть чтобы сигнал triggered() запускал слот с конкретным параметром.
нет, только через промежуточный слот.
И, кстати, слот со своим типом данных в качестве аргумента требует некоторых телодвижений - регистрация типа в системе метаинформаци Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 3.4.2010, 1:56
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Речь шла об этом?
CMakeFiles/../../qfrostgui.dir/area.cpp.o: In function `qfgui::Area::qt_metacall(QMetaObject::Call, int, void**)':                                                
area.cpp:(.text+0xe1f): undefined reference to `qfgui::Area::slotSetTool(qfgui::QFrost::ToolType)'


Странно, даже enum не даёт использовать.

где почитать про то, о чём вы упомянули (регистрация типа в системе метаинформаци Qt)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 2:22
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вообще-то ошибки компиляции быть не должно, просто соединение может не установиться.
Покажи полностью объявление класса, в котором объявлен слот pickInstrument

вообще существуем много всяких примочек в Qt, чтобы зарегестрировать свои типы данных:
Q_ENUMS
Q_DECLARE_METATYPE
qRegisterMetaType()
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 3.4.2010, 3:17
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


я балбес, декларэйшн не написал
теперь заработало

и я не свой объект передаю, а енумную фигню

спасибо

Кстати, правлильная ошибка из-за отсутствия соответствующих макросов выглядит примерно так:
QObject::connect: Cannot connect (null)::signalToolChosen(QFrost::ToolType) to qfgui::Area::slotSetTool(QFrost::ToolType)

:)

добавил Q_ENUMS(QFrost::ToolType) после макроса Q_OBJECT в хедерах классов, где енум надо использовать в системе сигналов-слотов, но это не помогло... как надо-то? :(

странно...

смотрите, сейчас сделано так:
Area::Area(MainWindow* parent)    : QGraphicsView(parent),
    //...
{
    //...

    connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)),
            SLOT(slotSetTool(QFrost::ToolType)));
}


И ругается
QObject::connect: Cannot connect (null)::signalToolChosen(QFrost::ToolType) to qfgui::Area::slotSetTool(QFrost::ToolType)


Если заставить этот connect выполняться попозже, то всё ок, коннект проходит и всё работает.
Есть идеи?

Сообщение отредактировал Obey-Kun - 3.4.2010, 3:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 3:24
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Obey-Kun @ 3.4.2010, 7:17) *
QObject::connect: Cannot connect (null)::signalToolC...
проблему выделил жирным. Т.е. неизвестно какому классу принадлежит функция

Цитата(Obey-Kun @ 3.4.2010, 7:17) *
connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)),
SLOT(slotSetTool(QFrost::ToolType)));
вообще соединять в дочернем объекте сигнал родителя - плохая идея, т.к., как минимум, при чтении кода, сначала читается код верхнего, по иерархии, объекта. И лишь при возникновении непонимания лезишь внутрь дочернего.
Поэтому такое соединение нужно делать в родительском объекте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 3.4.2010, 3:26
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Экспериментировал. В MainWindow было:
    area = new Area;
    scene = new Scene;
    area->setScene(scene);
    setCentralWidget(area);


Ясен пень, что connect(parent, SIGNAL(signalToolChosen(QFrost::ToolType)), SLOT(slotSetTool(QFrost::ToolType))); в конструкторе Area как надо не работало, ведь создавалось оно без родительского виджета, а потом уже он назначался. Исправил на:
    area = new Area(this);
    scene = new Scene;
    area->setScene(scene);
    setCentralWidget(area);

Разумеется, всё заработало.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 3:26
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9666
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


мало того объявления родительского сигнала в дочернем объекте не видно, обычно. Наверное это и есть причина ошибки. Дело в том, что компилятор не контролирует соединение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.2.2021, 16:05