From 3e7b65dca5c4efbf4035304fb6ad5a5250bff617 Mon Sep 17 00:00:00 2001 From: Christoph Holzheuer Date: Tue, 2 Sep 2025 16:58:56 +0200 Subject: [PATCH] add signal prototypes --- src/application/xqchildmodel.cpp | 14 ++++++- src/application/xqchildmodel.h | 4 ++ src/application/xqmainmodel.cpp | 8 ++++ src/application/xqmainmodel.h | 6 +++ src/application/xqmainwindow.cpp | 67 +++++++++++++++++++++++--------- src/application/xqmainwindow.h | 18 +++++++-- src/items/xqitem.h | 4 +- src/main.cpp | 11 ------ src/model/xqviewmodel.cpp | 24 +++++++++--- src/model/xqviewmodel.h | 4 ++ 10 files changed, 118 insertions(+), 42 deletions(-) diff --git a/src/application/xqchildmodel.cpp b/src/application/xqchildmodel.cpp index 1b0e169..658ad21 100644 --- a/src/application/xqchildmodel.cpp +++ b/src/application/xqchildmodel.cpp @@ -76,6 +76,17 @@ void XQChildModel::addModelData( const XQNodePtr& contentRoot ) } + +//! SLOT als weiterleitung vom SIGNAL itemchanged + +void XQChildModel::onItemChanged(XQItem& item ) +{ + qDebug() << " --- Child item changed: " << item.text(); +} + + +//! Erzeugt eine model-section und fügt den zugehörigen header ein. + void XQChildModel::addSectionEntry( const QString& key, const XQNodePtr& contentEntry ) { XQModelSection& section = _sections.at( key ); @@ -89,7 +100,8 @@ void XQChildModel::addSectionEntry( const QString& key, const XQNodePtr& content } } -//! erzeugt ein adhoc-contextmenu, je nachdem welche aktionen gerade möflich sind. + +//! erzeugt ein adhoc-contextmenu, je nachdem welche aktionen gerade möglich sind. void XQChildModel::initContextMenu() { diff --git a/src/application/xqchildmodel.h b/src/application/xqchildmodel.h index d98d88e..3819e3b 100644 --- a/src/application/xqchildmodel.h +++ b/src/application/xqchildmodel.h @@ -32,6 +32,10 @@ public: void addModelData(const XQNodePtr& contentRoot ); void addSectionEntry(const QString& key, const XQNodePtr& contentEntry ); +//public slots: + + void onItemChanged( XQItem& item ) override; + protected: //void setupViewProperties() override; diff --git a/src/application/xqmainmodel.cpp b/src/application/xqmainmodel.cpp index 87dee9b..ca37b44 100644 --- a/src/application/xqmainmodel.cpp +++ b/src/application/xqmainmodel.cpp @@ -77,3 +77,11 @@ void XQMainModel::addSectionItem( const XQModelSection& section, XQItem* project projectItem->appendRow( newItem ); expandNewItem(projectItem->index() ); } + + + +void XQMainModel::onItemChanged( XQItem& item ) +{ + qDebug() << " --- MAIN Model on itemChanged:" << item.text(); + +} diff --git a/src/application/xqmainmodel.h b/src/application/xqmainmodel.h index 3b05002..a5339fc 100644 --- a/src/application/xqmainmodel.h +++ b/src/application/xqmainmodel.h @@ -35,6 +35,12 @@ public: XQItem* addProjectItem( XQNodePtr contentNode ); void addSectionItem( const XQModelSection& section, XQItem* projectItem ); + +//public slots: + + void onItemChanged(XQItem& item ) override; + + protected: void initContextMenu() override; diff --git a/src/application/xqmainwindow.cpp b/src/application/xqmainwindow.cpp index d0d39b2..68573c1 100644 --- a/src/application/xqmainwindow.cpp +++ b/src/application/xqmainwindow.cpp @@ -88,18 +88,36 @@ void XQMainWindow::initMainWindow() connect( _actionExit, &QAction::triggered, this, &XQMainWindow::onExit ); connect( _actionAbout, &QAction::triggered, this, &XQMainWindow::onAbout ); - //connect( _mainTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onDoubleClicked(QModelIndex)) ); - connect( _mainTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(onTreeItemClicked(QModelIndex)) ); connect( _tabWidget, SIGNAL(tabBarClicked(int)), this, SLOT(onTabClicked(int)) ); + //connect(&_mainModel, &QStandardItemModel::itemChanged, this, &XQMainWindow::onTreeItemChanged ); + //connect( _mainTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onDoubleClicked(QModelIndex)) ); + //connect( _mainTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(onTreeItemClicked(QModelIndex)) ); + /* + connect( _mainTreeView, &QTreeView::clicked, this, [&,this](const QModelIndex& index) + { + onTreeItemClicked( XQItem::xqItemFromIndex(index) ); + }); + */ + connect( _mainTreeView, &QTreeView::clicked, this, [&,this](const QModelIndex& index) + { + onMyFirz( XQItem::xqItemFromIndex(index) ); + }); + + connect( this, &XQMainWindow::doTheFirz, this, &XQMainWindow::onMyFirz ); + + XQItem* item = new XQItem(); + item->setText("xxxFITZ!"); + + emit doTheFirz(*item); /* - connect( &_mainModelView, &XQViewModel::itemCreated, this, [=, this](XQItem* item) + connect( &_mainModel, &XQViewModel::itemCreated, this, [=, this](XQItem* item) { // when a new main tree item has been created ... - QString pID = item->contentNode()->attribute(c_ProjectID); - _mainTreeView->setCurrentIndex( item->index() ); + QString pID = item.contentNode()->attribute(c_ProjectID); + _mainTreeView->setCurrentIndex( item.index() ); // ... we set the current view to this node if( _documentStore.contains( pID ) ) _tabWidget->setCurrentWidget( _documentStore[pID].modelView->treeTable() ); @@ -109,11 +127,11 @@ void XQMainWindow::initMainWindow() try { // hand over undostack - _mainModelView.setUndoStack(&_undoStack); + _mainModel.setUndoStack(&_undoStack); // hand over left side navigation tree - _mainModelView.setTreeTable(_mainTreeView); + _mainModel.setTreeTable(_mainTreeView); // #1. init the left side main tree view - _mainModelView.initModel( c_MainModelName ); + _mainModel.initModel( c_MainModelName ); // #2. load demo data loadDocument( c_DocumentFileName1 ); @@ -245,20 +263,19 @@ void XQMainWindow::onAbout() } + //! wenn ein item im navigations-baum geklickt wird, soll die document //! view rechts angepasst werden. -void XQMainWindow::onTreeItemClicked(const QModelIndex& index ) +void XQMainWindow::onTreeItemClicked( XQItem& item ) { - XQItem& entry = XQItem::xqItemFromIndex(index); + qDebug() << " --- XXX mainWindow onTreeItemClicked:" << item.text(); + _mainTreeView->selectionModel()->select(item.index(), QItemSelectionModel::Select); - qDebug() << " --- XXX mainWindow onTreeItemClicked:" << entry.text(); - _mainTreeView->selectionModel()->select(index, QItemSelectionModel::Select); - - if( XQNodePtr contentNode = entry.contentNode() ) + if( XQNodePtr contentNode = item.contentNode() ) { - //XQNodePtr contentNode = entry.contentNode() + //XQNodePtr contentNode = item.contentNode() QString key = contentNode->attribute(c_ProjectID); qDebug() << " --- FIRZ: key: " << key; @@ -266,8 +283,21 @@ void XQMainWindow::onTreeItemClicked(const QModelIndex& index ) if( isThere) _tabWidget->setCurrentWidget( _documentStore[key].modelView->treeTable() ); } +} +void XQMainWindow::onTreeItemChanged(XQItem& item ) +{ + qDebug() << " --- MAIN WINDOW on itemChanged:" << item.text(); +} +void XQMainWindow::onChildViewItemClicked( XQItem& item ) +{ + qDebug() << " --- MAIN WINDOW on CHILD item CLICK:" << item.text(); +} + +void XQMainWindow::onChildViewItemChanged( XQItem& item ) +{ + qDebug() << " --- MAIN WINDOW on CHILD itemChanged:" << item.text(); } @@ -277,7 +307,7 @@ void XQMainWindow::onTabClicked( int index ) { //const QString& key = _documentStore[index].treeItem->attribute( c_ProjectID ); //qDebug() << " ---- tab clicked: " << index << " : " << _documentStore[index].friendlyName;// << ": " << key; - //_mainTreeView->setCurrentIndex( _documentStore[index].treeItem->index() ); + //_mainTreeView->setCurrentIndex( _documentStore[index]->treeTtem.index() ); } void XQMainWindow::onSectionCreated( const XQModelSection& section ) @@ -285,7 +315,7 @@ void XQMainWindow::onSectionCreated( const XQModelSection& section ) qDebug() << " --- XXX section created: " << section.contentType() << ":" << section.sheetRootNode()->to_string(); if( _currentProjectItem ) { - _mainModelView.addSectionItem( section, _currentProjectItem ); + _mainModel.addSectionItem( section, _currentProjectItem ); } } @@ -383,6 +413,7 @@ void XQMainWindow::loadDocument( const QString& fileName ) connect( childModel, SIGNAL(sectionCreated(XQModelSection)), this, SLOT(onSectionCreated(XQModelSection)) ); connect( childModel, SIGNAL(sectionToggled(XQModelSection)), this, SLOT(onSectionToggled(XQModelSection)) ); + //connect( childModel, &QStandardItemModel::itemChanged, this, &XQMainWindow::onTreeItemChanged); // Den globalen undo-stack ... childModel->setUndoStack(&_undoStack); @@ -391,7 +422,7 @@ void XQMainWindow::loadDocument( const QString& fileName ) childModel->setTreeTable(childTreeView); // neuen eintrag im übsichts-baum erzeugen - _currentProjectItem = _mainModelView.addProjectItem( contentRoot ); + _currentProjectItem = _mainModel.addProjectItem( contentRoot ); _documentStore.addDocument( fileName, pTitle, _currentProjectItem, childModel ); // die Modelstruktur anlegen diff --git a/src/application/xqmainwindow.h b/src/application/xqmainwindow.h index dbc9d4a..4169b16 100644 --- a/src/application/xqmainwindow.h +++ b/src/application/xqmainwindow.h @@ -33,8 +33,17 @@ public: void initMainWindow(); +signals: + + void doTheFirz(XQItem& item); + public slots: + virtual void onMyFirz(XQItem& item) + { + qDebug() << " --- myFirz: " << item.text(); + } + void onUndo(); void onRedo(); @@ -46,7 +55,10 @@ public slots: void onAbout(); void onExit(); - void onTreeItemClicked(const QModelIndex& index ); + void onTreeItemClicked( XQItem& item ); + void onTreeItemChanged( XQItem& item ); + void onChildViewItemClicked( XQItem& item ); + void onChildViewItemChanged( XQItem& item ); void onTabClicked( int index ); //void onItemCreated( XQItem* item ); void onSectionCreated( const XQModelSection& section); @@ -56,8 +68,6 @@ public slots: protected: - - // fixme implement void showDocumnet( const QString& key ){} void loadDocument( const QString& fileName ); @@ -68,7 +78,7 @@ protected: QUndoStack _undoStack; XQDocumentStore _documentStore; - XQMainModel _mainModelView; + XQMainModel _mainModel; XQItem* _currentProjectItem{}; diff --git a/src/items/xqitem.h b/src/items/xqitem.h index 47796e0..444c3c6 100644 --- a/src/items/xqitem.h +++ b/src/items/xqitem.h @@ -268,9 +268,7 @@ protected: }; - - - +Q_DECLARE_METATYPE(XQItem); Q_DECLARE_METATYPE(XQItem::RenderStyle); Q_DECLARE_METATYPE(XQItem::EditorType); Q_DECLARE_METATYPE(XQItem::UnitType); diff --git a/src/main.cpp b/src/main.cpp index b92de74..faa7ede 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,17 +79,6 @@ using namespace Qt::Literals::StringLiterals; int main(int argc, char *argv[]) { - /* - - // Signal für einzelne QStandardItem-Änderungen -connect(model, &QStandardItemModel::itemChanged, - this, [](QStandardItem *changedItem){ - QVariant state = changedItem->data(Qt::CheckStateRole); - qDebug() << "Neuer Check-State:" << state.toInt(); -}); - */ - - QApplication app(argc, argv); //app.setStyle("fusion"); XQMainWindow window; diff --git a/src/model/xqviewmodel.cpp b/src/model/xqviewmodel.cpp index 7c9e22c..6ed39e6 100644 --- a/src/model/xqviewmodel.cpp +++ b/src/model/xqviewmodel.cpp @@ -40,19 +40,23 @@ void showItemList( const XQItemList& list) } -//! Konstruktur mit parent. +//! Konstruktor mit parent. XQViewModel::XQViewModel( QObject* parent ) : QStandardItemModel{ parent }, _itemFactory{ XQItemFactory::instance() } { invisibleRootItem()->setData( "[rootItem]", Qt::DisplayRole ); setItemPrototype( new XQItem ); - - connect(this, &QStandardItemModel::itemChanged, this, [](QStandardItem *item) + /* + // auf änderungen kann in den unterklassen reagiert werden + connect(this, &QStandardItemModel::itemChanged, this, [this](QStandardItem *item) { - qDebug() << " --- item changed: " << item->text(); + XQItem* xqItem = static_cast(item); + onItemChanged( *xqItem ); }); + */ + //qRegisterMetaType("XQItem"); } @@ -185,6 +189,16 @@ void YourClass::onItemChanged(const QModelIndex &topLeft, const QModelIndex &bot } +/* +//! SLOT als weiterleitung vom SIGNAL itemchanged + +void XQViewModel::onItemChanged(XQItem* item ) +{ + qDebug() << " --- BASE item changed: " << item->text(); + +} +*/ + //! SLOT, der aufgerufen wird, wenn eine edit-action getriggert wurde. void XQViewModel::onActionTriggered(QAction* action) @@ -518,7 +532,7 @@ void XQViewModel::setTreeTable(XQTreeTable* mainView ) { // store view for direct access: the maintree _treeTable = mainView; - // connect myself as model to the mainview + // set myself as model to the mainview _treeTable->setModel(this); XQItemDelegate* delegate = new XQItemDelegate( *this ); _treeTable->setItemDelegate( delegate ); diff --git a/src/model/xqviewmodel.h b/src/model/xqviewmodel.h index ed92405..808bb38 100644 --- a/src/model/xqviewmodel.h +++ b/src/model/xqviewmodel.h @@ -95,12 +95,16 @@ public: */ + + virtual void onItemChanged( XQItem& item ) = 0; + public slots: virtual void onShowContextMenu(const QPoint& point); virtual void onActionTriggered(QAction* action); virtual void onToggleSection(const QString& sectionKey ); + // handle XQCommands ( == UndoCommand ) virtual void onCommandRedo( const XQCommand& command ); virtual void onCommandUndo( const XQCommand& command );