Есть вью, на нём можно делать всякие инструменты — выделения (как в гимпе) и т.п. Одновременно может существовать только один инструмент. Короче, в зависимости от действий пользователя создаётся-удаляется некий виджет.
Это сделано так:
if(event->button() == Qt::LeftButton) {
if(m_anchor->isPossibleOrEnabled()) {
m_is_creating_tool = true;
switch(m_tool_to_create) {
case QFrost::no_tool:
m_is_creating_tool = false;
event->ignore();
return;
case QFrost::rectangle_selection:
m_tool = new RectangleSelection(this);
break;
case QFrost::ellipse_selection:
m_tool = new EllipseSelection(this);
break;
case QFrost::cell_creator:
m_tool = new CellCreator(this);
break;
}
qfMainWindow()->emitCurrentToolsSettings();
}
event->accept();
}
m_tool — указатель на абстрактный объект класса Tool. Так вот, у каждого Tool есть какие-то свои слоты, которые должны ловить соответствующие сигналы (для каждого унаследованного от Tool класса это индивидуально). Где проводить connect — в конструкторе этих штук или в приведённом выше куске кода, сразу после new?
На данный момент провожу это в конструкторе этих виджетов, соответственно их слоты можно делать private, что вроде бы как делает всё безопаснее. Вроде бы как, удобно, но хотелось бы знать, как принято в больших проектах.
P.S: если кому-нибудь любопытно, qfMainWindow()->emitCurrentToolsSettings() — это функция, которая заставляет один из виджетов mainwindow послать сигналы о настройках инструментов (то есть сигналы о настройках всех возможных инструментов). Это нужно, чтобы инструмент знал о своих свойствах сразу же после создания. Ну а когда мы его создали, свойства можно ещё менять и он будет получать информацию из этих же сигналов.