Решил создать топик, он скорее не по столько по библиотеке QT, сколько по C++ и ООП, но поскольку с QT связана так или иначе структура программы и ее особенности, поэтому думаю лучше это обсудить здесь.
У меня, собстенно появился первый вопрос
Есть приложение. На нем 2 основных виджета :QGraphicsView и QTreeView. Они отображают одни и те же объекты - в графическом в виде, и в виде дерева - это вспомогательный вид. Когда щелкаешь по объектам правой кнопкой должно вызываться контекстное меню - как в QTreeView так и в QGraphicsview со стандартными командами - cut, copy, delete, properties и т.д.
В обоих виджетах я переопределяю contextMenuEvent():
void MyTreeView::contextMenuEvent(QContextMenuEvent *event)
{
QItemSelectionModel *selectionModel = this->selectionModel();
QModelIndexList indexes = selectionModel->selectedIndexes();
QModelIndex index;
QList<MObject*> objects;
foreach(index, indexes)
if (index.isValid())
objects.push_back( static_cast<MObject *>( index.internalPointer() ) );
TContextMenuManager menuManager(this, event, objects);
menuManager.showMenu();
}
Здесь для QTreeView. MObject - базовый класс для всех моих объектов. В этой функции я получаю список выделенных элементов и передаю их в объект класса TMenuManager - он в зависимости от конкретного типа объекта выводит контекстное меню в точке event->globalPos(). Таким образом я использую один и тот же кусок кода и для QTreeView и для QGraphicsView. В TContextMenuManager я храню actions, коннектю их к слотам. Но ведь теже команды cut, copy, delete должны быть доступны и в главном меню приложения - в меню edit. То есть все actions приложения, в том числе и те которые могут быть вызваны через contextmenu, должны быть определены в каком-то глобальном классе? Так получается? Этот глобальный класс делать Singletone? А коннектить эти actions тоже в этом классе к его методам? А методы эти как-то прикрутить к паттерну Command?
В общем вопрос непростой, хочется сразу продумать архитектуру, чтобы не мучаться потом. Программирование все-таки - это не накидать кнопочек на форму.
Заранее спасибо, тем кто откликнется. Предлагаю подобные вопросы обсуждать в этой теме.