Custom QTreeWidgetItem context menu?
I am trying to create QTreeWidgetItems with custom context menus. I would like to have QTreeWidget and QTreeWidgetItem derived classes like the following example:
Code:
class QCustomTreeWidget;
{
public:
QCustomTreeItem(QCustomTreeWidget *view);
QCustomTreeItem(QCustomTreeItem *parent);
virtual ~QCustomTreeItem();
};
class QMyPluginItem : public QCustomTreeItem
{
public:
QMyPluginItem(QCustomTreeWidget *view);
QMyPluginItem(QCustomTreeItem *parent);
virtual ~QMyPluginItem();
{
// create the context menu
ContextMenu->addAction(actCustom);
connect(actCustom, SIGNAL(triggered(void)), this, SLOT(onCustomAction(void)));
ContextMenu->exec( event->globalPos() );
delete ContextMenu;
}
private slots:
void onCustomAction();
};
{
Q_OBJECT
public:
QCustomTreeWidget
(QWidget *parent
= 0);
virtual ~QCustomTreeWidget();
protected:
{
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:
Quote:
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!
Re: Custom QTreeWidgetItem context menu?
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.
Re: Custom QTreeWidgetItem context menu?
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.
Re: Custom QTreeWidgetItem context menu?
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);
}
Re: Custom QTreeWidgetItem context menu?
I guess one could also useQTreeWidget::itemClicked to provide menus for items.