PDA

View Full Version : Custom QTreeWidgetItem context menu?



AaronMK
1st October 2007, 04:39
I am trying to create QTreeWidgetItems with custom context menus. I would like to have QTreeWidget and QTreeWidgetItem derived classes like the following example:



class QCustomTreeWidget;

class QCustomTreeItem : public QTreeWidgetItem
{
public:
QCustomTreeItem(QCustomTreeWidget *view);
QCustomTreeItem(QCustomTreeItem *parent);
virtual ~QCustomTreeItem();

virtual void onContextMenu(QContextMenuEvent *event) = 0;
};

class QMyPluginItem : public QCustomTreeItem
{
public:
QMyPluginItem(QCustomTreeWidget *view);
QMyPluginItem(QCustomTreeItem *parent);
virtual ~QMyPluginItem();

virtual void onContextMenu(QContextMenuEvent *event)
{
// create the context menu
QMenu* ContextMenu = new QMenu();

QAction *actCustom = new QAction("Custom Action", ContextMenu);
ContextMenu->addAction(actCustom);
connect(actCustom, SIGNAL(triggered(void)), this, SLOT(onCustomAction(void)));

ContextMenu->exec( event->globalPos() );

delete ContextMenu;
}

private slots:
void onCustomAction();
};


class QCustomTreeWidget : public QTreeWidget
{
Q_OBJECT
public:
QCustomTreeWidget(QWidget *parent = 0);
virtual ~QCustomTreeWidget();

protected:
virtual void contextMenuEvent(QContextMenuEvent *event)
{
QCustomTreeItem* selected =
reinterpret_cast<QCustomTreeItem*>(currentItem());

if ( 0 != selected )
selected->onContextMenu(event);
};
};


I know that Singals and Slots can only work on QObjects. Looking at the documentation and the Qt source, QTreeWidgetItem is not a subclass of QObject (or anything). I dislike multiple inheritance very much, but tried deriving QCustomTreeItem from both QTreeWidgetItem and QObject to add Signal and Slot functionality. I got the following warning:


Warning: Class QCustomTreeItem inherits from two QObject subclasses QTreeWidgetItem and QObject. This is not supported!

If these did not have to be customizable plugin objects, I might just bite the bullet and put a big switch block in QCustomTreeWidget::contextMenuEvent().

Is there a way make the above model work?

Thanks!

mchara
1st October 2007, 09:20
This error means, that QTreeQWidgetItem is QObject internally...

anyhow, i think using contextMenu events is bad idea in this case(because it's not enougth elastic mechanism). I would create MyTreeWidgetItem with setMenu(QMenu*) / getMenu methods, and override mouseClick method(of a tree) to call getMenu()->exec() for clicked item. It's easier way in my opinion.

AaronMK
2nd October 2007, 05:23
All I really see that doing is moving the execution of the menu into QCustomTreeWidget. I would still need a way to connect the QCustomTreeWidget::onCustomAction(); slot to actCustom::triggered().

I'll probably end up making a QObject derived class that spits out the tree-node when needed. Then I'll have something to signal/slot.

mkkguru
30th January 2010, 14:13
Hi,u try this below code

//action method.
void XXXX::XXX()
{


action_New = new QAction("&New", ui->treeWidget);
action_Open = new QAction("&Open", ui->treeWidget);

//add the code at slots
connect(action_New, SIGNAL(triggered()), this, SLOT(on_action_New_triggered()));
connect(action_Open, SIGNAL(triggered()), this, SLOT(on_action_Open_triggered()));

ui->treeWidget->addAction(action_New);
ui->treeWidget->addAction(action_Open);
ui->treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);

}

aamer4yu
1st February 2010, 05:42
I guess one could also useQTreeWidget::itemClicked to provide menus for items.