C++ code excerpts for question about a simpler way to support in-cell text editing of only a single column within a Qt 4.4 QTreeWidget. (Only top-level QTreeWidgetItems are used -- this is just a list, not an actual treeview). Auth: Phil Weinstein, CADSWES Date: 9-17-2009 Ref: http://cadswes2.colorado.edu/~philw/2009/QtQuestions/QTreeWidgetEditing/ // ****************** // *** Contents *** // ****************** (1) Some Module Definitions (2) Three Class Declarations: class GreenBookConfigPanel : public QWidget class GreenBookConfigPanel::SlotTree : public QTreeWidget class GreenBookConfigPanel::SlotTreeItem : public QTreeWidgetItem (3) Relevant Method Definitions void GreenBookConfigPanel::initConnections() void GreenBookConfigPanel::disableSlotTreeItemEditing () void GreenBookConfigPanel::slotsTree_itemSelectChanged () void GreenBookConfigPanel::slotsTree_itemActivated (..) void GreenBookConfigPanel::slotsTree_itemClicked (..) void GreenBookConfigPanel::slotsTree_itemDoubleClicked (..) void GreenBookConfigPanel::slotsTree_itemChanged (..) GreenBookConfigPanel::SlotTreeItem::SlotTreeItem (QTreeWidget* parent, ) void GreenBookConfigPanel::SlotTreeItem::enableItemEditing (bool ena) void GreenBookConfigPanel::SlotTreeItem::processCellEdit (int col) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // ************************************* // *** (1) Some Module Definitions *** // ************************************* // QTreeWidget* _slotsTreeWidget Columns static const int SLOT_COL_ORD (0); // ordinal static const int SLOT_COL_SLOT_NAME (1); // full slot name static const int SLOT_COL_TIMESTEP (2); // step size static const int SLOT_COL_USER_LAB (3); // user provided column label static const int SLOT_COL_SHOW_SUM (4); // toggle: show column sum static const int SLOT_COL_SHOW_MEAN (5); // toggle: ... mean static const int SLOT_COL_SHOW_MIN (6); // toggle: ... minimum static const int SLOT_COL_SHOW_MAX (7); // toggle: ... maximum static const int SLOT_COL_SHOW_START (8); // toggle: ... first value static const int SLOT_COL_SHOW_END (9); // toggle: ... last value //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // ************************************** // *** (2) Three Class Declarations *** // ************************************** class GreenBookConfigPanel : public QWidget { Q_OBJECT private: class SlotTree; // : public QTreeWidget -- declared below class SlotTreeItem; // : public QTreeWidgetItem -- declared below ... ... ... private // Widget Handles SlotTree* _slotsTreeWidget; ... ... ... private slots: void slotsTree_itemSelectChanged (); void slotsTree_itemActivated (QTreeWidgetItem*, int col); void slotsTree_itemClicked (QTreeWidgetItem*, int col); void slotsTree_itemDoubleClicked (QTreeWidgetItem*, int col); void slotsTree_itemChanged (QTreeWidgetItem*, int col); ... ... ... }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class GreenBookConfigPanel::SlotTree : public QTreeWidget { private: GreenBookConfigPanel* _panel; public: SlotTree (GreenBookConfigPanel*); protected: // virtual from QAbstractScrollArea virtual void contextMenuEvent (QContextMenuEvent*); }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- class GreenBookConfigPanel::SlotTreeItem : public QTreeWidgetItem { ... ... ... private: QTreeWidget* _parentTreeWidget; SlotRec _slotRec; int _ord; public: SlotTreeItem (QTreeWidget*, const SlotRec&, int ord=(-1)); virtual ~SlotTreeItem(); ... ... ... void enableItemEditing (bool); void processCellEdit (int col); ... ... ... }; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // ***************************************** // *** (3) Relevant Method Definitions *** // ***************************************** void GreenBookConfigPanel::initConnections() { ... ... ... // ***************************************** // *** Slot List TreeWidget (TreeView) *** // ***************************************** connect (_slotsTreeWidget, SIGNAL (itemSelectionChanged()), SLOT (slotsTree_itemSelectChanged())); connect (_slotsTreeWidget, SIGNAL (itemActivated (QTreeWidgetItem*, int)), SLOT (slotsTree_itemActivated (QTreeWidgetItem*, int))); connect (_slotsTreeWidget, SIGNAL (itemClicked (QTreeWidgetItem*, int)), SLOT (slotsTree_itemClicked (QTreeWidgetItem*, int))); connect (_slotsTreeWidget, SIGNAL (itemDoubleClicked (QTreeWidgetItem*, int)), SLOT (slotsTree_itemDoubleClicked (QTreeWidgetItem*, int))); connect (_slotsTreeWidget, SIGNAL (itemChanged (QTreeWidgetItem*, int)), SLOT (slotsTree_itemChanged (QTreeWidgetItem*, int))); ... ... ... } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::disableSlotTreeItemEditing() { const int topItemCnt = _slotsTreeWidget->topLevelItemCount(); for (int inx = 0; inx < topItemCnt; ++inx) { QTreeWidgetItem* item = _slotsTreeWidget->topLevelItem (inx); SlotTreeItem* slotItem = dynamic_cast (item); if (slotItem) { slotItem->enableItemEditing (false); } } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::slotsTree_itemSelectChanged() { disableSlotTreeItemEditing(); sensitizeWidgets(); emit slotSelectionChanged(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::slotsTree_itemActivated ( QTreeWidgetItem* item, int col) { SlotTreeItem* slotItem = dynamic_cast (item); if (slotItem) { disableSlotTreeItemEditing(); } sensitizeWidgets(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::slotsTree_itemClicked ( QTreeWidgetItem* item, int col) { SlotTreeItem* slotItem = dynamic_cast (item); if (slotItem) { // This will have an effect only on relevant columns. slotItem->toggleColumnSwitch (col); disableSlotTreeItemEditing(); } sensitizeWidgets(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::slotsTree_itemDoubleClicked ( QTreeWidgetItem* item, int col) { SlotTreeItem* slotItem = dynamic_cast (item); if (slotItem) { disableSlotTreeItemEditing(); if (col == SLOT_COL_USER_LAB) { slotItem->enableItemEditing (true); _slotsTreeWidget->editItem (slotItem, col); } if (col == SLOT_COL_SLOT_NAME) { Slot* slotPtr = slotItem->locateSlot(); if (slotPtr) { QGui::openSlot (slotPtr); } } } sensitizeWidgets(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::slotsTree_itemChanged ( QTreeWidgetItem* item, int col) { SlotTreeItem* slotItem = dynamic_cast (item); if (slotItem) { slotItem->processCellEdit (col); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // constructor 1 of 1 GreenBookConfigPanel::SlotTreeItem::SlotTreeItem (QTreeWidget* parent, const SlotRec& rec, int ord /*=(-1)*/) : QTreeWidgetItem (parent), _parentTreeWidget (parent), _slotRec (rec), _ord (ord) { ... ... ... // disable item editing enableItemEditing (false); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::SlotTreeItem::enableItemEditing (bool ena) { const Qt::ItemFlags oldFlags (flags()); Qt::ItemFlags newFlags (oldFlags); if (ena) { newFlags = (oldFlags | Qt::ItemIsEditable); } else { newFlags = (oldFlags & (~Qt::ItemIsEditable)); } if (newFlags != oldFlags) { setFlags (newFlags); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void GreenBookConfigPanel::SlotTreeItem::processCellEdit (int col) { const QString editText = text (col); const QString trimText = editText.trimmed(); const QString padText = pad1 + trimText + pad2; if (col == SLOT_COL_USER_LAB) { enableItemEditing (false); const QString oldText = _slotRec._userColLabel; if (oldText != trimText) { _slotRec._userColLabel = trimText; } if (editText != padText) { setText (col, padText); } } } --- (end) ---